2017-01-17 20 views
0

我是一个新手锈,并试图在两个数字阅读和计算它们的商:错误读取及计算商数

use std::io; 

enum Option<T> { 
    None, 
    Some(T), 
} 

fn safe_div(n: i32, d: i32) -> Option<i32> { 
    if d == 0 { 
     return None; 
    } 
    return Some(n/d); 
} 

fn main() { 
    println!("Please input your numerator."); 
    let mut numerator = String::new(); 
    io::stdin() 
     .read_line(&mut numerator) 
     .expect("Failed to read line"); 
    println!("Please input your denominator."); 
    let mut denominator = String::new(); 
    io::stdin() 
     .read_line(&mut denominator) 
     .expect("Failed to read line"); 
    match safe_div(numerator, denominator) { 
     None => println!("Can't divide by zero!"), 
     Some(v) => println!("Quotient is {}", v), 
    } 
} 

,但我收到以下错误反复几次,当我尝试编译:

src/safe_div.rs:12:12: 12:21 error: mismatched types: expected Option<i32> , found std::option::Option<i32> (expected enum Option , found enum std::option::Option) [E0308]

我在这里错过了什么?

回答

6

默认情况下,任何Rust应用程序包括前奏。您可以关闭它,但如果不这样做,它会将::std::option::Option<T>类型以及其变体NoneSome纳入范围。

除非有人决定使用这些名称创建一些东西,在这种情况下,新定义的项目会占据优先位置。

你这里的问题是,你只有半阴影标准Option

  • 你定义Option,其优先级高于::std::option::Option
  • 你没拉NoneSome到同一范围(他们嵌套在Option范围内),而::std::option::Option::{None, Some}是通过前奏

结果是Option是指::Option,而NoneSome分别是指::std::option::Option::None::std::option::Option::Some。一团糟。

一个解决方案,如果你真的想覆盖,是导入NoneSome自己:

enum Option<T> { 
    None, 
    Some(T) 
} 

use Option::{None, Some}; 

另一种是不重新定义Option

一旦您应用了任一修复,您将意识到您将字符串作为参数传递给safe_div,您可以使用.parse().expect("Expected i32")将它们解析为整数。

+0

我试过这个修复和编译错误消失,但它给我的运行时错误,而不是:'线程'

'恐慌在'预期i32''和死而宁比打印商。 – wogsland

0

不需要定义Option;这是already part of the standard library。删除定义,它将会超过该错误。接下来的错误是您有一个String,您试图使用without parsing it first号码。

我会强烈建议你回去再读The Rust Programming Language。第一章,特别是猜谜游戏,正是针对这一级别的介绍。

+0

@wogsland请继续阅读我的答案。在第一段中只有** 3个句子,而第三个句子*描述了这个错误。 – Shepmaster

+0

@wogsland由于这是专业程序员的网站,我希望目标受众能够阅读某种语言或框架的入门文档,并能够从较小的组件中编写出更大的解决方案。此外,我**链接到现有的答案**如何解析字符串;你是否希望回答者为你编写所有代码? – Shepmaster

+1

快速提示:*发烧友*和专业程序员的网站;) –