我是一个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 回答
默认情况下,任何Rust应用程序都包含前奏 . 您可以将其关闭,但如果不这样做,它会将
::std::option::Option<T>
类型及其变体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
:另一个不是重新定义
Option
.一旦你应用了任何一个修复,你就会意识到你将字符串作为参数传递给
safe_div
,你可以使用.parse().expect("Expected i32")
将它们解析为整数 .您不需要定义
Option
;这是already part of the standard library . 删除定义,它将超过该错误 . 下一个错误是你有String
,你试图用作数字without parsing it first .我要回去再读一遍The Rust Programming Language . 第一章,特别是猜谜游戏,正是针对这一级别的介绍 .