在本教程中,给出了以下代码:
fn increment(r: &mut int) {
*r = *r + 1;
}
fn main () {
let mut x = ~10;
increment(x);
}
Run Code Online (Sandbox Code Playgroud)
我知道此语法已过时,因此我自己移植了代码:
fn increment(r: &mut i32) {
*r = *r + 1;
}
fn main() {
let mut x = Box::new(10);
increment(x);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,出现以下错误:
fn increment(r: &mut int) {
*r = *r + 1;
}
fn main () {
let mut x = ~10;
increment(x);
}
Run Code Online (Sandbox Code Playgroud)
我尝试了许多与&组合的组合mut,等等。发挥这种功能的正确方法是什么?
首先,您的教程已经过时了。有一本很棒的官方书。
其次,除非确实需要,否则不应该使用盒子。也就是说,不要这样写:
let mut x = Box::new(10);
Run Code Online (Sandbox Code Playgroud)
写这个:
let mut x = 10;
Run Code Online (Sandbox Code Playgroud)
除非你真的知道为什么需要Box<i32>。简而言之,需要为以下三项提供框:递归类型,特征对象和非常大的结构传递。
第三,是的,正如AB所说,您需要使用&mut参考:
let mut x = 10;
increment(&mut x);
Run Code Online (Sandbox Code Playgroud)
这里不再需要取消引用,因为x不再是Box,它只是一个常规值。