锈。通过引用修改结构字段时无法分配给“&”引用后面的 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]);
}
我不知道这是否适用于您的整个程序。
我有 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]);
}
我不知道这是否适用于您的整个程序。