借用检查器不让我在调用 setter 后调用 getter

Borrow checker won't let me call getter after calling setter

我一直在用 Rust 开发一个简单的词法分析器。但是,我有 运行 变成 error[E0502]: cannot borrow 'a_rule' as immutable because it is also borrowed as mutable 的问题。我检查了其他答案,但似乎找不到原因。

pub struct Rule<'a> {
    selector: &'a str,
}

impl<'a> Rule<'a> {
    pub fn new(selector: &'a str) -> Self {
        Self {
            selector
        }
    }

    pub fn get_selector(&'a self) -> &'a str {
        self.selector
    }

    pub fn set_selector(&'a mut self, selector: &'a str) {
        self.selector = selector
    }
}

#[cfg(test)]
mod tests {
    use super::Rule;

    #[test]
    fn set_selector_test() {
        let mut a_rule = Rule::new(".foo");
        a_rule.set_selector(".bar");

        assert_eq!(a_rule.get_selector(), ".bar")
    }
}

错误:

error[E0502]: cannot borrow `a_rule` as immutable because it is also borrowed as mutable
  --> src/lib.rs:30:20
   |
28 |         a_rule.set_selector(".bar");
   |         ------ mutable borrow occurs here
29 | 
30 |         assert_eq!(a_rule.get_selector(), ".bar")
   |                    ^^^^^^
   |                    |
   |                    immutable borrow occurs here
   |                    mutable borrow later used here

(Playground)

我也想借此机会询问是否建议使用 java 之类的 get 和 set 方法,或者只是将结构中的成员设置为 public。

请随时指出任何其他愚蠢的错误。

通过使 get_selectorset_selector&'a self/&'a mut self,您已将规则的生命周期与字符串的生命周期联系起来,但这不是他们之间的正确关系。你可以生产 &'a strs 而不需要你的 self 活那么久(或者被可变地借用那么久)因为 self.selector 已经是一个 &'a str.

删除 self 引用中的 'a

pub fn get_selector(&self) -> &'a str {
    self.selector
}

pub fn set_selector(&mut self, selector: &'a str) {
    self.selector = selector;
}

(但是你根本不需要这个 getter 和 setter 吗?考虑不可变性!)