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