2014-09-25 31 views
0

內部的某些相同的名稱(T)我是相當新生鏽,所以我在官方Guide變量與鏽

let input = io::stdin().read_line() 
         .ok() 
         .expect("Failed to read line"); 
let input_num: Option<uint> = from_str(input.as_slice()); 

let num = match input_num { 
    Some(num) => num, 
    None  => { 
     println!("Please input a number!"); 
     return; 
    } 
}; 

雖然瞭解前兩個語句跨越這一段代碼來(上inputinputnum),我不太確定比賽聲明。所以我檢查了documentation這表明Option<T>可以取兩個值,一個是NoneSome(T),對於某些(object?)T。所以我測試了以下代碼:

io::println( 
    match input_num { 
     Some(num) => "somenum", 
     None  => { 
      println!("Please input a number only!"); 
      return; 
     } 
    } 
); 

此代碼按預期工作;如果輸入數字,則打印somenum,否則將打印錯誤消息。但是,編譯器給出了一個警告:warning: unused variable: num , #[warn(unused_variable)] on by default。這證實了我的猜想,即'match'中的num被用作變量。

問題:怎麼可能是rust不抱怨(在指南的例子),具有相同名稱num兩個變量?或者是否將指針移至內部num到外部num? 同樣在空的情況下return究竟返回什麼?我猜這是單位(),因爲它提到here

功能沒有-> ...隱含有返回類型()

編輯:對不起,缺少明顯的一點。 return直接退出該功能,而不會將任何東西放入num

P.S.我注意到使用cargo build進行編譯並不會在第二次發出警告(不作任何更改)。 cargo是否繼續跟蹤版本或其他內容?

回答

1

您有任何有關Java或C#的經驗嗎?許多主流編程語言允許您在一個新的塊範圍內使用另一個具有相同名稱的變量來變量shadow。例如,看看這個C#代碼:

using System; 

public class Test 
{ 
    public static void Main() 
    { 
     int x = 10; 
     { 
      int x = 20; 
      Console.WriteLine(x); 
     } 
     Console.WriteLine(x); 
    } 
} 

事實上鏽病是在陰影方面更加靈活:可以陰影變量多次,你想不明確做一個支撐塊。

fn main() { 
    let i = 10i32; 
    let i = "foo"; 
    println!("{}", i); 
} 

在這裏,第一i和第二i沒有關係。我們只是失去了使用(參考)第一個i的方式。

這證實了我的猜想,即'match'中的num用作變量。

是的,模式匹配可以引入新的變量。但通過模式匹配引入的新變量num與外部num沒有直接關係,其值由match表達式給出。

我可以轉換鏽代碼到少慣用的鏽,說明發生了什麼事:

let num = 
    if input_num.is_some() { 
     let num = input_num.unwrap(); 
     num 
    } else { 
     println!("Please input a number!"); 
     return; 
    } 
; 

至於不cargo build觀察警告,我懷疑這是因爲貨物已經建立從您的代碼.o和沒懶得重複做同樣的工作兩次,知道你的代碼沒有變化。

+0

在9個月的Java編程中,我沒有遇到過一個陰影示例。也許是因爲它有點混亂。感謝您的鏈接和額外的信息。 – theindigamer 2014-09-25 16:49:35

+0

嗯,我發現Java確實是少得多的寬恕http://doanduyhai.wordpress.com/2012/07/07/variable-shadowing/ http://stackoverflow.com/questions/4623334/question-about-variable -scope-and-shadowing in-java http://stackoverflow.com/questions/141140/why-does-java-not-have-block-scoped-variable-declarations難怪你沒有機會遇到它。 – nodakai 2014-09-25 16:59:10

+0

在Rust中,你有模式匹配和一切都是表達式原則。這些將您推向名稱遮蔽的例子。 Java也沒有,所以毫不奇怪,你不會有太多的陰影發生。 – 2014-09-25 22:59:42