我正在玩最基本的Rust概念,并对我之前的问题提出了跟进问题:Why does the binary + operator not work with two &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
方法,这不是我想要的。另一方面,第一个示例的**
语法看起来很奇怪。 : - /
答案 0 :(得分:4)
你就在那里。来自Rust tutorial:
但是,在
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
到借用参考的转换不会产生任何运行时开销,但我对实现的了解不够充分。