我正在研究 Rust 最基本的概念,并对上一个问题有一个后续问题:为什么二元 + 运算符不能与两个 &mut int 一起使用?
我想在堆上创建一个
int
并将其传递给另一个函数进行修改。
我想出了这个:
fn increment(number: &mut Box<int>) {
**number = **number + **number;
println!("{}", number);
}
fn main() {
let mut test = box 5;
increment(&mut test);
println!("{}", test);
}
此打印
10
10
这就是我想要的。
但是,
**
看起来很奇怪,我想我也可以写这种东西:
fn increment(number: &mut int) {
*number = *number + *number;
println!("{}", number);
}
fn main() {
let mut test = box 5;
increment(&mut* test);
println!("{}", test);
}
关于我在堆上创建
int
并在另一个函数中修改它的意图,哪种方法是正确的(如果有)?对我来说,好像在第二个示例中,变量在传递给 increment
方法之前从堆移回堆栈,这不是我想要的。另一方面,第一个示例的 **
语法看起来很奇怪。 :-/owned_box
的情况下,不需要采取任何明确的操作。编译器会自动将框
转换为像box point
这样的引用。这是另一种形式的借贷。在这种情况下,所拥有的盒子中的内容将被借出。 所以你需要做的就是利用隐性借用:&point
fn increment(number: &mut int) {
*number = *number + *number;
}
fn main() {
let mut test = box 5;
increment(test);
println!("{}", test);
}
我不认为
test
的值被移回到这里的堆栈中。我怀疑从
Box
到借用引用的转换不会有任何运行时开销,但我对实现的了解还不够确定。更新2023-08-13 Rust 1.70:上面的代码现在会产生编译错误:
错误:`box_syntax`已被删除相反:
let mut test = Box::new(5);