在this教程中,给出了以下代码:
fn increment(r: &mut int) {
*r = *r + 1;
}
fn main () {
let mut x = ~10;
increment(x);
}
我知道这个语法已经过时了,所以我自己移植了代码:
fn increment(r: &mut i32) {
*r = *r + 1;
}
fn main() {
let mut x = Box::new(10);
increment(x);
}
当我尝试编译时,出现以下错误:
error[E0308]: mismatched types
--> src/main.rs:8:15
|
8 | increment(x);
| ^ expected &mut i32, found struct `std::boxed::Box`
|
= note: expected type `&mut i32`
found type `std::boxed::Box<{integer}>`
我尝试了许多与&符号mut
s等组合的组合。制作这种功能的正确方法是什么?
答案 0 :(得分:6)
首先,您的教程已经过时了。有一个很棒的official book。
其次,除非你真的需要,否则你不应该使用盒子。也就是说,不要写这个:
let mut x = Box::new(10);
写下这个:
let mut x = 10;
除非您确实知道您需要Box<i32>
的原因。简而言之,需要三个方面的框:递归类型,特征对象和传递非常大结构。
第三,是的,作为A.B.说,你需要使用&mut
引用:
let mut x = 10;
increment(&mut x);
此处无需取消引用,因为x
不再是Box
,它只是一个常规值。
答案 1 :(得分:1)
我试图让一个add_one()
函数在Box<i32>
上运行,最后让它像在这个例子中一样工作:
fn main() {
let mut x = Box::new(5);
println!("{:?}", x);
println!("{:?}", *x);
// Taking a mutable reference to the dereference of x.
add_one(&mut *x);
println!("{:?}", x);
boxed_add_one(&mut x);
println!("{:?}", x);
}
// Gets a reference to a mutable int
fn add_one(num: &mut i32) {
*num += 1;
}
// Gets a reference to a mutable box with int
fn boxed_add_one(b: &mut Box<i32>) {
let ref mut num = **b;
*num += 1;
}