锈。通过引用修改结构字段时无法分配给“&”引用后面的 X

Rust. Cannot assign to X which is behind a `&` reference when modify struct fields by reference

我有 Input 结构,其中包含对 Data 结构实例的引用。这个 Data 结构包含我想覆盖的字段,我想在其他函数之间共享。当我尝试从某处修改 Data 实例的某些字段时,出现如下错误:

cannot assign to data.value1, which is behind a & reference

这是我的代码:

struct Data {
    value1: Option<i32>,
    value2: Option<String>,
    value3: Option<Vec<u8>>,
}

impl Data {
    pub fn new() -> Self {
        Self {
            value1: None,
            value2: None,
            value3: None,
        }
    }
}

struct Input<'a> {
    data: &'a Data,
}

fn handler(mut input: Input) {
    let data = &mut input.data;
    data.value1 = Some(10);
    data.value2 = Some(String::from("test string"));
    data.value3 = Some(vec![1, 2, 3]);
}

struct Client {
    data: Data,
}

impl Client {
    pub fn new() -> Self {
        Self {
            data: Data::new(),
        }
    }

    pub fn process(&mut self) {
        handler(Input {
            data: &self.data,
        })
    }
}

这是minimal sandbox implementation

当我通过引用存储实例字段时,如何修改 Data 实例字段?

input.data本身就是引用,所以data的类型是&mut &Data。由于写入至少要经过一个共享(non-mutable)引用,因此被拒绝。

在您的示例中起作用的是使 Input 本身也包含对 Data 的可变引用:

struct Input<'a> {
    data: &'a mut Data,
}

fn handler(input: Input) {
    let data = input.data;
    data.value1 = Some(10);
    data.value2 = Some(String::from("test string"));
    data.value3 = Some(vec![1, 2, 3]);
}

我不知道这是否适用于您的整个程序。