【问题标题】:Why Rust mutable borrow occurs here?为什么这里会出现 Rust 可变借用?
【发布时间】:2019-12-01 01:15:18
【问题描述】:

我正在学习 Rust,下面的代码来自在线书籍Rust 编程语言

fn main() {
    let mut s = String::from("hello world");

    let word = first_word(&s);

    s.clear(); // error!

    println!("the first word is: {}", word);
}


fn first_word(s: &String) -> &str {
    let bytes = s.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }

    &s[..]
}

当我运行它时,我得到了这个:

C:/Users/administrator/.cargo/bin/cargo.exe run --color=always --package rust2 --bin rust2
   Compiling rust2 v0.1.0 (C:\my_projects\rust2)
error[E0502]: cannot borrow `s` as mutable because it is also borrowed as immutable
 --> src\main.rs:6:5
  |
4 |     let word = first_word(&s);
  |                           -- immutable borrow occurs here
5 | 
6 |     s.clear(); // error!
  |     ^^^^^^^^^ mutable borrow occurs here
7 | 
8 |     println!("the first word is: {}", word);
  |                                       ---- immutable borrow later used here

error: aborting due to previous error

For more information about this error, try `rustc --explain E0502`.
error: could not compile `rust2`.

To learn more, run the command again with --verbose.

Process finished with exit code 101

但据我了解,s 只是一个可变的String 对象。 s.clear() 只是在对象上调用一个方法,这会产生 mutable borrow 错误?可变借用类似于let mut a = &mut s。语句s.clear()是直接使用s借用从何而来?

【问题讨论】:

  • String::clear 的签名是pub fn clear(&mut self)。那是一个可变的借用。
  • let word = first_word(&s); 字的存在只是因为first_words
  • @edwardw 感谢您的回复。我认为应该是这个原因。
  • @edwardw 你能把它作为一个答案,以便我可以选择它作为正确答案吗?

标签: rust mutable borrowing


【解决方案1】:

语句s.clear()是直接用s,借用是从哪里来的?

方法的第一个参数始终是self,它表示正在调用该方法的结构的实例。如果不想拥有所有权,只是读取结构中的数据而不写入,那么可以选择&self。另一方面,如果想要更改调用方法的实例,那么可以选择&mut self。最后但并非最不重要的一点是,self 取得所有权,通常会转换为其他东西。

这里,String::clear 定义为:

pub fn clear(&mut self)

这是一个可变借用。如果以另一种方式调用clear 方法,您可以清楚地看到原因:

let word = first_word(&s);
String::clear(&mut s);
println!("the first word is: {}", word);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多