內部的某些相同的名稱(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;
}
};
雖然瞭解前兩個語句跨越這一段代碼來(上input
和inputnum
),我不太確定比賽聲明。所以我檢查了documentation這表明Option<T>
可以取兩個值,一個是None
或Some(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
是否繼續跟蹤版本或其他內容?
在9個月的Java編程中,我沒有遇到過一個陰影示例。也許是因爲它有點混亂。感謝您的鏈接和額外的信息。 – theindigamer 2014-09-25 16:49:35
嗯,我發現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
在Rust中,你有模式匹配和一切都是表達式原則。這些將您推向名稱遮蔽的例子。 Java也沒有,所以毫不奇怪,你不會有太多的陰影發生。 – 2014-09-25 22:59:42