gpt4 book ai didi

rust - 在 Rust 中跟踪并与借用检查器作斗争

转载 作者:行者123 更新时间:2023-11-29 08:11:59 24 4
gpt4 key购买 nike

每次接受用户输入时,我都会创建一个新变量(通过阴影)来获取输入。我认为这是低效的,而不是阴影的目的,我还能如何有效地重用变量输入?

如果没有阴影,它会给出错误cannot borrow "input"as mutable because it is also borrowed as immutable。据我了解,获取用户输入需要可变引用。

use std::io; // Import for IO

fn main() {
let name: &str; // Variables
let balance: f32; // Variables
let interest: f32; // Variables
let mut input = String::new(); // Variables

println!("Please enter your name: "); // Print
io::stdin().read_line(&mut input).expect("failed to read from stdin");
name = input.trim();
println!("Please enter your bank account balance: "); // Print

loop {
let mut input = String::new(); // Remove this and I get an error
io::stdin().read_line(&mut input).expect("failed to read from stdin");

match input.trim().parse::<f32>() {
Ok(_) => {
balance = input.trim().parse().unwrap();
break;
},
Err(_) => println!("Your balance cannot contain letters or symbols"),};
}
}

println!("Please enter your interest rate percent: "); // Print

loop {
let mut input = String::new(); // Remove this and I get an error
io::stdin().read_line(&mut input).expect("failed to read from stdin");

match input.trim().parse::<f32>() {
Ok(_) => {
interest = input.trim().parse().unwrap();
break;
},
Err(_) => println!("Your balance cannot contain letters or symbols"),};
}
}

println!("{}, your gain from interest is : ${}", name, (interest * balance * 0.01)); // Print
}

我来自 Java,我对借用的工作原理以及什么时候影子是个好主意感到困惑。我知道旧值仍然存在并且对它的任何引用都意味着如果您不再需要旧值那么您将无缘无故占用资源。任何建议都有帮助,谢谢。

最佳答案

错误告诉你问题所在:

error[E0502]: cannot borrow `input` as mutable because it is also borrowed as immutable
--> src/main.rs:20:27
|
13 | name = input.trim();
| ----- immutable borrow occurs here
...
20 | io::stdin().read_line(&mut input).expect("failed to read from stdin");
| ^^^^^^^^^^ mutable borrow occurs here
...
47 | println!("{}, your gain from interest is : ${}", name, (interest * balance * 0.01)); //Print
| ---- immutable borrow later used here

input.trim() 创建对输入的不可变引用并将其存储在 name 中。如果您删除 String::new() 调用,那么您正在调用 io::stdin().read_line(&mut input),它采用对输入的可变引用,但是在 name 变量中仍然有一个不可变的输入引用。

在 Rust 中,不允许同时存在不可变引用和可变引用,因此编译器会报错。

你不能真正重用这里的变量,你需要克隆或做你正在做的事情并完全创建一个新的字符串。

关于rust - 在 Rust 中跟踪并与借用检查器作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57104975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com