Rust中的以下代码会生成并运行:
fn func(s: &mut String) -> i32 {
s.push_str("!");
println!("{}", s);
1
}
fn main() {
let mut x = String::from("hello world");
let v = func(&mut x);
println!("{}", v);
let r = &x[..];
println!("{}", r);
}
如果将func
的返回类型更改为&str
,我会得到
error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
--> src/main.rs:11:18
|
9 | let v = func(&mut x);
| - mutable borrow occurs here
10 | println!("{}", v);
11 | let r = &x[..];
| ^ immutable borrow occurs here
12 | println!("{}", r);
13 | }
| - mutable borrow ends here
我知道在给定的范围内,只允许一个可变引用,但是返回类型有什么关系呢?
答案 0 :(得分:2)
这个问题基本上是Why doesn't the lifetime of a mutable borrow end when the function call is complete?的重复,但是我已经使用并撤回了我的金牌双锤。让我知道这是什么时候被关闭,我将删除此答案。
如果您不返回参考,就不会有借用。
如果返回类型
func
更改为&str
然后,由于lifetime elision,该函数等效于:
fn func<'a>(s: &'a mut String) -> &'a str
并且允许返回的值从参数中借用。因此,如果参数使返回值无效,则不再可以更改该参数。
如果返回的值不是从参数中借用,则可以使用生命周期来解开它们。这里我们返回一个'static
字符串:
fn func(s: &mut String) -> &'static str {
""
}
另请参阅: