首先,我想为这个标题不明确的菜鸟问题道歉,我是 Rust 的新手。
无论如何,这是一些(有效的)代码:
struct A {
data: i32
}
struct B<'s> {
a: &'s A
}
impl<'s> B<'s> {
fn new(reference: &'s A) -> B<'s> {
B {
a: reference
}
}
}
fn main() {
let a1 = A{data: 0};
let b1 = B::new(&a1);
let b2 = B::new(&a1);
}
有一个包含一些数据的结构 A 和一个包含对 A 的不可变引用的结构 B。在 main 方法中,创建了几个 B 对象并引用了一个 A 对象。
现在我只想改变一件事:在 B::new() 方法中我想在将其用作 B 的不可变成员之前修改 'reference' 的数据。我这样试过:
struct A {
data: i32
}
struct B<'s> {
a: &'s A
}
impl<'s> B<'s> {
fn new(reference: &'s mut A) -> B<'s> {
// Modify data
reference.data += 1;
B {
a: reference
}
}
}
fn main() {
let mut a1 = A{data: 0};
let b1 = B::new(&mut a1);
let b2 = B::new(&mut a1);
}
但是编译器不允许我,错误:一次不能多次借用 a1
作为可变的。为什么 new() 完成后可变借用不结束?实现我正在尝试的目标的正确方法是什么?
最佳答案
正如@AndreaP 所说,问题是因为您的引用具有相同的生命周期。
通常,您可以通过简单地拆分函数(一个 &
和一个 &mut
)来解决这些问题。
如果你真的需要这种模式,那么我认为你正在寻找的是Cell
/RefCell
:http://doc.rust-lang.org/std/cell/index.html
编辑:感谢@Ker 的评论,我更新了代码,因此 B
确实持有对 A
的引用而不是它的副本。旧代码完全错误。
use std::cell::{Cell};
#[derive(Debug)]
struct A {
data: Cell<i32>
}
#[derive(Debug)]
struct B<'a> {
a: &'a A
}
impl<'a> B<'a> {
fn new(reference: &'a A) -> B<'a> {
// Modify data
reference.data.set(reference.data.get() + 1);
B {
a: reference
}
}
}
fn main() {
let a1 = A{data: Cell::new(0)};
let b1 = B::new(&a1);
let b2 = B::new(&a1);
println!("{}", a1.data.get());
println!("{:?}", b1);
println!("{:?}", b2);
}
关于rust - 具有对其他结构的不可变引用的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31514542/