借用检查器不让我在调用 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
我也想借此机会询问是否建议使用 java 之类的 get 和 set 方法,或者只是将结构中的成员设置为 public。
请随时指出任何其他愚蠢的错误。
通过使 get_selector
和 set_selector
取 &'a self
/&'a mut self
,您已将规则的生命周期与字符串的生命周期联系起来,但这不是他们之间的正确关系。你可以生产 &'a str
s 而不需要你的 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 吗?考虑不可变性!)
我一直在用 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
我也想借此机会询问是否建议使用 java 之类的 get 和 set 方法,或者只是将结构中的成员设置为 public。
请随时指出任何其他愚蠢的错误。
通过使 get_selector
和 set_selector
取 &'a self
/&'a mut self
,您已将规则的生命周期与字符串的生命周期联系起来,但这不是他们之间的正确关系。你可以生产 &'a str
s 而不需要你的 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 吗?考虑不可变性!)