rust - 具有对其他结构的不可变引用的结构

标签 rust

首先,我想为这个标题不明确的菜鸟问题道歉,我是 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/

相关文章:

rust - 我如何使用 Zola 遍历某个部分的帖子?

reference - 将元组引用的迭代器解压缩到两个引用集合中

unit-testing - 消息带有撇号时,should_panic预期无法正常工作

function - Rust 中的绝对值函数

rust - 有没有办法继承一个特征以使用该特征的所有方法?

rust - 不每晚使用时如何忽略基准测试?

rust - 如何从 &mut Nested 创建 &mut MyEnum?

rust - 使用 nom errorkind 返回简单自定义错误的正确方法是什么?

opengl - 如何使用 gstreamer crates 从 BufferRef 中提取 GL 纹理 ID?

io - 未实现 Seek 时如何从 std::io::Read 特性中推进数据?