首页 > 解决方案 > 'let' 的范围与阴影和字符串 -> &str 转换

问题描述

使用以下代码,我尝试返回用户输入的温度 &str,但没有成功。然后,我试图返回 f32,但仍然很挣扎......

Q1。我在底部收到错误的原因是因为' let temp = String::new();'的范围仍然存在,即使我稍后let temp = temp.trim().parse::<f32>();在循环中通过'''遮蔽'它?

Q2。如何重写代码以使其返回 &str?

fn gettemp() -> f32 {
    let temp = String::new();

    loop {
        println!("What is your temperature?");

        io::stdin().read_line(&mut temp).expect("Failed to read the line");

        let temp = temp.trim().parse::<f32>();

        if !temp.is_ok() {
            println!("Not a number!");
        } else {
            break;
        }
    }

    temp
}

错误:

error[E0308]: mismatched types
  --> src/main.rs:70:5
   |
49 | fn gettemp() -> f32 {
   |                 --- expected `f32` because of return type
...
70 |     temp
   |     ^^^^ expected f32, found struct `std::string::String`
   |
   = note: expected type `f32`
              found type `std::string::String`

标签: rust

解决方案


关于问题 1,您可以break使用一个值退出循环:

fn gettemp() -> f32 {
    let mut temp = String::new();

    loop {
        println!("What is your temperature?");

        io::stdin().read_line(&mut temp).expect("Failed to read the line");

        let temp = temp.trim().parse::<f32>();

        if !temp.is_ok() {
            println!("Not a number!");
        } else {
            break temp.unwrap() // yield value when breaking out of loop
        }
    }
}

这样,整个循环的值就是你传递的东西break

关于问题2,我不确定您是否真的要这样做,因为&str是借来的类型。我认为你想String在这种情况下返回一个拥有数据的。


推荐阅读