2014-09-25 55 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