我正在使用一个库中的结构体
控制台输出中的错误非常清晰,但我无法解决问题。
Foo
和Bar
,但在客户端代码中出现了编译错误。我将代码简化为以下内容:use std::marker::PhantomData;
struct Foo {
some_str: &'static str,
}
struct Bar<'a> {
some_str: &'static str,
marker: PhantomData<&'a Foo>,
}
impl Foo {
fn read_data(&self) {
// add code here
}
fn create_bar<'a>(&'a mut self) -> Bar<'a> {
Bar {
some_str: "test2",
marker: PhantomData,
}
}
}
fn process(_arr: &mut [Bar]) {}
fn main() {
let mut foo = Foo { some_str: "test" };
let mut array: [Bar; 1] = [foo.create_bar()];
process(&mut array);
foo.read_data();
}
输出:
error[E0502]: cannot borrow `foo` as immutable because it is also borrowed as mutable
--> src/main.rs:30:5
|
28 | let mut array: [Bar; 1] = [foo.create_bar()];
| --- mutable borrow occurs here
29 | process(&mut array);
30 | foo.read_data();
| ^^^ immutable borrow occurs here
31 | }
| - mutable borrow ends here
控制台输出中的错误非常清晰,但我无法解决问题。
create_bar
函数需要一个&'a mut self
:这是在以可变方式借用foo。尽管在这个例子中实际上没有使用到self,但是'a寿命将从分配到数组到数组超出范围的时刻。通过括号限制了数组的作用域并结束了可变借用。正在进行工作以添加“非词法生存期”,使得Rust能够聪明地自行判断'a
在此情况下实际上不需要一直到函数结束,因为array
在foo.read_data
之后未被使用。 - Paolo Falabella