为什么我的Rust函数的参数值在打开一个带有IO缓冲区的文件后会改变?

z9ju0rcb  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(154)

我有一个函数get_computer,它将computer_key字符串作为参数,以便在文件中找到它。代码如下:

pub fn get_computer(computer_key: String){
    
    // read the file
    let f = File::open("computer_stock.dat").expect("Error opening file"); // line 14

    // create a buffer
    let f = BufReader::new(f);

    // Storage for the Computer Data
    let mut computer_data = String::new();

    // Signify that the computer name is found
    let mut is_found = false;

    // Loop through the lines
    for lines in f.lines(){

        // Get the string from the line
        let lines = lines.unwrap();

        // Check if it's the end of the computer's information
        if is_found && lines.trim() == ";"{
            break;
        }

        // If we found the computer, change the is_found state.
        if lines == computer_key{
            is_found = true;
        }else{
            // Otherwise, continue
            continue;
        }

        if is_found{
            computer_data.push_str(&lines);
        }
    }
    println!("{}", computer_data);

}

但是,由于某种原因,当我调试它时,computer_key将其值更改为Line 14之后的""。我的main函数只做了一个简单的调用:

fn main(){
    get_computer(String::from("Computer Name A"))
}

为什么会这样?打开文件对computer_key有影响吗?
我可以通过在Line 14之前克隆computer_key来解决这个问题。但是,我宁愿不这样做。
编辑:
只要意识到,即使我只是尝试在Line 14之前执行println!("{}", computer_key);computer_key也会由于某种原因而被消耗。也许是关于我的进口货

use std::fs::File;
use std::io::{BufReader, BufRead};`

经过更多的测试,我发现computer_key没有被消耗。我用这个代码测试了一个新项目:

// Just to test if it's about the imports
use std::fs::File;
use std::io::{BufReader, BufRead};

pub fn get_computer(computer_key: String){
    println!("{}", computer_key);
    println!("{}", computer_key);
    println!("{}", computer_key);
    if computer_key == "Computer Name A"{
        println!("YES");
    }

}

fn main(){
    get_computer(String::from("Computer Name A"))
}

调试后,YES在终端中打印出来,但在VSCode调试器变量视图中,它包含""。除非我把它放进watch lists,否则它会正确显示。
我不知道为什么,但这是调试器的或VsCode的错误。我不知道发生了什么,但我在VsCode中使用了CodeLLDB。如果你们有这方面的信息,请给予我一些资源或链接。谢谢

sd2nnvve

sd2nnvve1#

经过更多的测试,我发现computer_key没有被消耗。我用这个代码测试了一个新项目:
我看到的是

你是不是在某处设置了一个断点?在程序运行完成后,我不希望任何变量有任何值,我注意到vscode甚至不会在VARIABLES下列出变量名。
让调试器为变量显示空字符串""的唯一方法是执行以下操作:

use std::fs::File;
use std::io::{BufReader, BufRead};

pub fn get_computer(computer_key: String){
    println!("{}", computer_key);
    println!("{}", computer_key);
    println!("{}", computer_key);
    if computer_key == "Computer Name A"{
        println!("YES");
    }
}

fn main(){
    let mut my_arg = String::new();
    my_arg.push_str("Computer Name B");  //ADD BREAKPOINT TO THIS LINE 
    get_computer(my_arg);
}

相关问题