【发布时间】:2019-03-08 14:10:49
【问题描述】:
为什么我不能将数据传递给一个函数,而该函数不会修改它并且所有权上下文没有结束?
此代码给出错误:
let mut ar = [1, 2, 3, 4, 5];
let slice = &mut ar[1..=3];
slice[1] = 9;
println!("{:?} ", slice);
for e in ar.iter(){
println!("{}", e)
}
这是错误:
error[E0502]: cannot borrow `ar` as immutable because it is also borrowed as mutable
--> src/main.rs:6:14
|
3 | let slice = &mut ar[1..=3];
| -- mutable borrow occurs here
...
6 | for e in ar.iter() {
| ^^ immutable borrow occurs here
...
9 | }
| - mutable borrow ends here
我的猜测是我们无法将数组传递给println! 函数,因为我们已经借用了它,但我不明白为什么。 println! 函数不会改变它!
我发现以下行为难以理解。如果我有数组,如何打印数组?
此代码有效并打印[2, 9, 4]
let mut ar = [1, 2, 3, 4, 5];
let slice = &mut ar[1..=3];
slice[1] = 9;
println!("{:?} ", slice);
此外,这段代码可以正常工作并正确打印所有内容,通过修改切片我们修改了原始数组!
let mut ar = [1, 2, 3, 4, 5];
{
let slice = &mut ar[1..=3];
slice[1] = 9;
println!("{:?} ", slice); // -> [2, 9, 4]
}
for e in ar.iter(){
println!("{}", e) //-> 1 2 9 4 5 as expected since the slice has changed
}
【问题讨论】:
-
又一个需要非词法生命周期的情况。
-
我觉得不是重复的问题,我的问题是为什么我不能打印数组,求解释,不是解决问题,问题已经解决了最后一个例子。
-
我不明白你的第二次重复,但我读到了非词法生命周期,我开始理解那里的问题......基本上编译器过于保守:-)
-
println!是一个宏,而不是一个函数。
标签: rust slice mutability borrowing