内部的某些相同的名称(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