如何在 Rust 嵌套之外获取变量变化?

How to get variable changes outside of nesting in rust?

嘿,所以我对 Rust 和编程真的很陌生,我遇到了一些以前从未遇到过的问题。我正在尝试 return 将用户输入变量的结果显示在嵌套之外的屏幕上,但我似乎没有任何运气。

use std::{thread, time::Duration};

fn main(){
    let mut modifer = 0;
    let mut ModValue=0;
    let mut ModReason = "";

    let Y = "Y";
    let y = "y";
    let N = "N";
    let n = "n";

    print!("{esc}c", esc = 27 as char);
    let mut ModYN = String::new();
    println!("Are there any modifiers (Y/N)");
    std::io::stdin().read_line(&mut ModYN).unwrap();
    let ModYN = ModYN.trim();

    if ModYN == y || ModYN == Y{
        ModValue = 1;
        print!("{esc}c", esc = 27 as char);
        let mut modifer:f32=0.0;
        let mut input = String::new();
    
        //I'm attempting to get the input from the user to define a modifer reason and value
        println!("Please enter the modifer: ");
        std::io::stdin().read_line(&mut input).expect("Not a valid string");
        modifer = input.trim().parse().expect("Not a valid number");

        let mut ModReason = String::new();
        println!("Whats the modifer reason: ");
        std::io::stdin().read_line(&mut ModReason).unwrap();
        let ModReason = ModReason.trim();
    }
    //Then print those results to the screen outside of nesting
    print!("{esc}c", esc = 27 as char);
    println!("-Modifer-");
    println!("{}",&mut modifer);
    println!("-Modifer Reason-");
    println!("{}",&mut ModReason);
    thread::sleep(Duration::from_secs(5));
}

我尝试了很多事情;从将其分配为可变变量或借用变量本身到甚至将嵌套扩展到打印结果之外。但是我碰壁了,真的需要一些帮助。

你的代码中有几个缺陷,由于你的问题只涉及一个,我将只解释那个。这意味着下面的代码 将无法编译 。但它会让您更接近解决方案。

我认为你的问题来自于你不知道 let var = valuevar = value 之间的区别。这些是非常不同的语句:第二个将 value 分配给 var,而第一个 创建 一个新变量(遮蔽具有相同名称的变量,如果有一个),然后分配给它。与

相同
let var;
var = value;

因此,当您在循环中创建一个新变量 ModReason 时,您并没有修改循环外的变量:您实际上是在创建一个新变量,只是为了在循环结束时销毁它if 语句(不使用它)。所以解决办法就是不要每次都新建一个变量:

use std::{thread, time::Duration};

fn main(){
    let mut modifer = 0;
    let mut ModValue=0;
    let mut ModReason = "";

    let Y = "Y";
    let y = "y";
    let N = "N";
    let n = "n";

    print!("{esc}c", esc = 27 as char);
    let mut ModYN = String::new();
    println!("Are there any modifiers (Y/N)");
    std::io::stdin().read_line(&mut ModYN).unwrap();
    let ModYN = ModYN.trim();

    if ModYN == y || ModYN == Y{
        ModValue = 1;
        print!("{esc}c", esc = 27 as char);
        let mut modifer:f32=0.0;
        let mut input = String::new();
    
        //I'm attempting to get the input from the user to define a modifer reason and value
        println!("Please enter the modifer: ");
        std::io::stdin().read_line(&mut input).expect("Not a valid string");
        modifer = input.trim().parse().expect("Not a valid number");

        ModReason = String::new();
        println!("Whats the modifer reason: ");
        std::io::stdin().read_line(&mut ModReason).unwrap();
        ModReason = ModReason.trim();
    }
    //Then print those results to the screen outside of nesting
    print!("{esc}c", esc = 27 as char);
    println!("-Modifer-");
    println!("{}",&mut modifer);
    println!("-Modifer Reason-");
    println!("{}",&mut ModReason);
    thread::sleep(Duration::from_secs(5));
}

Rust 会警告你(因为,通过这种方式,你永远不会在循环外分配给 ModReason)如果你没有通过传递可变借用(这是绝对没用:只需使用 println!("{}", ModReason);).

此外,很可能 Rust 已经就几个未使用的变量警告过您:如果您阅读这些警告,您就会明白您做错了什么。