![](/img/trans.png)
[英]Rust: How to call a method with self from a method with &mut self
[英]How to call method on struct that has mutable self in Rust
我在以下设置时遇到问题:
#[derive(Debug)]
struct SomeStruct {
numbers: Vec<u32>,
}
impl SomeStruct {
fn some_func(&mut self) { // `mut` causes the issue
self.numbers.push(9); // Contrived but need to call self in here.
println!("Hello from some func");
}
}
pub fn main() {
let struct1 = SomeStruct {
numbers: vec![1, 2, 3],
};
let struct2 = SomeStruct {
numbers: vec![99, 98, 97],
};
let mut vec = Vec::new();
vec.push(&struct1);
vec.push(&struct2);
let first = vec.first_mut().unwrap();
// cannot borrow `**first` as mutable, as it is behind a `&` reference
// cannot borrow as mutable rustc(E0596)
first.some_func();
}
关于可变和借用有很多问题,但我仍然无法弄清楚。 有人可以解释为什么这是错误的以及如何解决它吗?
问题是vec
只有共享引用,即&SomeStruct
而不是SomeStruct
或&mut SomeStruct
。
在此设置中调用some_func()
无法成功,因为它需要&mut self
。 但是,有一些方法可以解决这个问题:
vec
拥有SomeStruct
,例如: vec,[struct1, struct2]
&mut struct1
和&mut struct2
推入 vecRefCell
允许您在持有共享引用的同时修改数据内部可变性解决方案如下所示:
use std::cell::RefCell;
#[derive(Debug)]
struct SomeStruct {
numbers: RefCell<Vec<u32>>,
}
impl SomeStruct {
fn some_func(&self) {
self.numbers.borrow_mut().push(9); // Contrived but need to call self in here.
println!("Hello from some func");
}
}
pub fn main() {
let struct1 = SomeStruct {
numbers: RefCell::new(vec![1, 2, 3]),
};
let struct2 = SomeStruct {
numbers: RefCell::new(vec![99, 98, 97]),
};
let mut vec = Vec::new();
vec.push(&struct1);
vec.push(&struct2);
let first = vec.first().unwrap();
// cannot borrow `**first` as mutable, as it is behind a `&` reference
// cannot borrow as mutable rustc(E0596)
first.some_func();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.