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

Rust 对其他结构具有不可变引用的结构,rust,Rust,首先,我想为这个没有明确名称的noob问题道歉,我是个新手 无论如何,这里有一些(工作)代码: 结构A{ 数据:i32 } 结构B{ fn新(参考:和的A)->B{ a:这是一个 } 恳求{ fn new(reference:&'s mut A)->B借用未完成,因为您在b1中保持了该引用的活动状态。因此,当您尝试对b2执行相同操作时,借用仍处于活动状态 也许你只是想要这个: fn main() { let mut a1 = A{data: 0}; let mut a2 = A{

首先,我想为这个没有明确名称的noob问题道歉,我是个新手

无论如何,这里有一些(工作)代码:

结构A{ 数据:i32 } 结构B{ fn新(参考:和的A)->B{ a:这是一个 } 恳求{
fn new(reference:&'s mut A)->B借用未完成,因为您在
b1
中保持了该引用的活动状态。因此,当您尝试对
b2
执行相同操作时,借用仍处于活动状态

也许你只是想要这个:

fn main() {
    let mut a1 = A{data: 0};
    let mut a2 = A{data: 0};
    let b1 = B::new(&mut a1);
    let b2 = B::new(&mut a2);
}

正如@AndreaP所说,这个问题是因为你引用了相同的生命周期

通常,您可以通过简单地拆分函数(一个
&
和一个
&mut
)来解决这些问题

如果您真的需要这种样式,那么我认为您需要的是
Cell
/
RefCell

编辑:由于@Ker comment,我更新了代码,因此
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);
}
使用std::cell::{cell};
#[导出(调试)]
结构A{
数据:单元格
}
#[导出(调试)]
结构B{

fn new(reference:&'a)->B感谢您的回答。不幸的是,在我的应用程序中,我需要一个a对象被几个B对象引用。谢谢!您完全正确,我已相应地修改了代码。
fn main() {
    let mut a1 = A{data: 0};
    let mut a2 = A{data: 0};
    let b1 = B::new(&mut a1);
    let b2 = B::new(&mut a2);
}
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);
}