带有可变借位的函数中的返回类型有什么影响?

时间:2018-08-24 18:13:15

标签: rust

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

我知道在给定的范围内,只允许一个可变引用,但是返回类型有什么关系呢?

1 个答案:

答案 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 {
    ""
}

另请参阅: