首页 文章

读取和计算商数时出错

提问于
浏览
0

我是一个Rust新手并试图读取两个数字并计算他们的商:

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错误:类型不匹配:预期选项<i32>,找到std :: option :: Option <i32>(预期枚举选项,找到enum std :: option :: Option )[E0308]

我在这里错过了什么?

2 回答

  • 0

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

    除非有人决定使用这些名称创建内容,否则新定义的项目将优先考虑 .

    你的问题是你只有一半阴影标准 Option

    • 你定义 Option ,优先于 ::std::option::Option

    • 你没有把 NoneSome 拉到同一个范围内(它们嵌套在 Option 范围内),而 ::std::option::Option::{None, Some} 则是通过前奏

    结果是 Option 引用 ::OptionNoneSome 分别引用 ::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") 将它们解析为整数 .

  • 6

    您不需要定义 Option ;这是already part of the standard library . 删除定义,它将超过该错误 . 下一个错误是你有 String ,你试图用作数字without parsing it first .

    我要回去再读一遍The Rust Programming Language . 第一章,特别是猜谜游戏,正是针对这一级别的介绍 .

相关问题