Types 读取错误&;计算商

Types 读取错误&;计算商,types,rust,Types,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 inpu

我是一名铁锈新手,尝试阅读两个数字并计算它们的商:

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),
    }
}
使用std::io;
枚举选项{
没有一个
一些(T),
}
fn安全分区(n:i32,d:i32)->选项{
如果d==0{
不返回任何值;
}
返回部分(不适用);
}
fn main(){
println!(“请输入您的分子。”);
让mut分子=String::new();
io::stdin()
.read_行(&mut分子)
.expect(“读取行失败”);
println!(“请输入您的分母。”);
让mut分母=String::new();
io::stdin()
.读取行(&mut分母)
.expect(“读取行失败”);
匹配安全分区(分子、分母){
None=>println!(“不能被零除!”),
一些(v)=>println!(“商为{}”,v),
}
}
但当我试图编译它时,以下错误重复了好几次:

src/safe_div.rs:12:12:21错误:不匹配的类型: 预期的
选项
, 找到
std::option::option
(预期的枚举
选项
, 找到枚举
std::option::option
)[E0308]

我在这里遗漏了什么?

您不需要定义
选项
;是的。删除该定义,它将通过该错误。下一个错误是,您有一个
字符串
,试图将其用作数字

我强烈建议你回去再读一遍。第一章,特别是猜谜游戏,正是针对这一层次的介绍。

您不需要定义
选项
;是的。删除该定义,它将通过该错误。下一个错误是,您有一个
字符串
,试图将其用作数字


我强烈建议你回去再读一遍。前几章,特别是猜谜游戏,正是针对这一层次的介绍。

默认情况下,任何Rust应用程序都包括序曲。您可以关闭它,但如果不关闭,它会将
::std::option::option
类型及其变体
None
Some
拉入范围

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

这里的问题是,您对标准的
选项只有一半的阴影:

  • 您定义了
    选项
    ,它优先于
    ::std::Option::Option
  • 您没有将
    None
    Some
    拉入相同的作用域(它们嵌套在
    选项
    作用域中),而
    ::std::Option::Option::{None,Some}
    通过前奏在那里
结果是,
选项
分别指
::选项
,而
部分
分别指
::std::Option::Option::None和
::std::Option::Option::Some
。一团糟

如果确实需要覆盖,一种解决方案是自己导入
None
Some

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

use Option::{None, Some};
enum选项{
没有一个
一些(T)
}
使用选项:{None,Some};
另一个是不重新定义
选项


一旦应用了这两个修复程序,您就会意识到您正在将字符串作为参数传递给
safe\u div
,您可以使用
.parse().expect(“预期的i32”)
将它们作为整数进行解析。

默认情况下,任何Rust应用程序都包括前奏。您可以关闭它,但如果不关闭,它会将
::std::option::option
类型及其变体
None
Some
拉入范围

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

这里的问题是,您对标准的
选项只有一半的阴影:

  • 您定义了
    选项
    ,它优先于
    ::std::Option::Option
  • 您没有将
    None
    Some
    拉入相同的作用域(它们嵌套在
    选项
    作用域中),而
    ::std::Option::Option::{None,Some}
    通过前奏在那里
结果是,
选项
分别指
::选项
,而
部分
分别指
::std::Option::Option::None和
::std::Option::Option::Some
。一团糟

如果确实需要覆盖,一种解决方案是自己导入
None
Some

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

use Option::{None, Some};
enum选项{
没有一个
一些(T)
}
使用选项:{None,Some};
另一个是不重新定义
选项


应用任一修复后,您将意识到您正在将字符串作为参数传递给
safe\u div
,您可以使用
.parse().expect(“Expected i32”)
将它们解析为整数。

@wogsland请继续阅读我的答案。第一段中只有三句话,第三句话描述了这个错误。@wogsland因为这是一个专业程序员的网站,我希望目标读者能够阅读语言或框架的介绍性文档,并能够用较小的组件编写较大的解决方案。此外,我还链接了一个关于如何解析字符串的现有答案;您希望回答者为您编写所有代码吗?简要说明:爱好者和专业程序员网站;)@沃格斯兰请继续阅读我的答案。第一段中只有三句话,第三句话描述了这个错误。@wogsland因为这是一个专业程序员的网站,我希望目标读者能够阅读语言或框架的介绍性文档,并能够用较小的组件编写较大的解决方案。此外,我还链接了一个关于如何解析字符串的现有答案;您是否希望应答者编写所有代码