我是一个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),
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译时,我多次重复以下错误:
src/safe_div.rs:12:12:12:21错误:类型不匹配:预期
Option<i32>,找到std::option::Option<i32>(预期枚举Option,找到枚举std::option::Option)[E0308]
我在这里错过了什么?
默认情况下,任何Rust应用程序都包含前奏.你可以将其关闭,但如果你不这样做,它拉的::std::option::Option<T>类型以及它的变种None,并Some进入活动范围.
除非有人决定使用这些名称创建内容,否则新定义的项目将优先考虑.
你的问题在于你只有一半的标准Option:
Option,优先于::std::option::OptionNone,并Some在同一个范围(它们嵌套在Option范围内),而::std::option::Option::{None, Some}通过前奏是有其结果是,Option指::Option消磨None和Some参考::std::option::Option::None和::std::option::Option::Some分别.一团糟.
一个解决方案,如果你真的想要覆盖,是导入None和Some你自己:
enum Option<T> {
None,
Some(T)
}
use Option::{None, Some};
Run Code Online (Sandbox Code Playgroud)
另一个不是要重新定义Option.
一旦你应用了任何一个修复程序,你就会意识到你将字符串作为参数传递给safe_div你,你可以用它.parse().expect("Expected i32")来解析它们作为整数.