rust - 如何修复不能借用可变的,因为它在一个`&`引用后面
问题描述
我是 rust 新手,正在尝试学习和实验,这里是操场的链接,下面有问题和解释:https ://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=19920813410a42500045cf2c6cc94f12
use std::fmt;
#[derive(Clone, Copy)]
struct Animal<'a> {
name: &'a str
}
impl <'a>Animal<'a> {
fn new(name: &'a str) -> Self { Self { name } }
}
struct Barn<'a> {
name: &'a str,
animals: Vec<Animal<'a>>
}
impl <'a> Barn<'a> {
fn new(name: &'a str, animals: Vec<Animal<'a>>) -> Self { Self { name, animals } }
}
impl <'a>fmt::Debug for Barn<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.name)
}
}
struct Farmer<'a> {
name: &'a str,
barns: Vec<Barn<'a>>
}
impl <'a> Farmer<'a> {
fn new(name: &'a str, barns: Vec<Barn<'a>>) -> Self { Self { name, barns } }
fn add_new_barn(&mut self, barn: Barn<'a>) {
self.barns.push(barn)
}
fn place_animal_in_barn(&mut self, animal: Animal, placement: &str) {
for barn in &self.barns {
// how do I do make this work?
if barn.name == placement {
barn.animals.push(animal);
}
}
}
}
impl <'a>fmt::Debug for Farmer<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:#?}", self.barns)
}
}
fn main() {
let mut farmer = Farmer::new("Farm Master Joe",
vec![
Barn::new("Tegridy Farms", vec![
Animal::new("cow"),
Animal::new("horse"),
Animal::new("pigeon")
]),
Barn::new("Barney", vec![
Animal::new("Purple Dinosaur"),
Animal::new("Green Dinosaur")
]),
Barn::new("White Rabbits R' Us", vec![
Animal::new("white rabbit"),
])
]
);
println!("{:#?}", farmer.name);
farmer.add_new_barn(Barn::new("The Good Place", vec![
Animal::new("Horse"),
Animal::new("Wombat")
]));
farmer.place_animal_in_barn(Animal::new("Turkey"), "The Good Place");
println!("{:#?}", farmer);
}
如何修复此方法,以便可以推送到向量?
fn place_animal_in_barn(&mut self, animal: Animal, placement: &str) {
for barn in &self.barns {
// how do I do make this work?
if barn.name == placement {
barn.animals.push(animal);
}
}
}
我收到以下错误,我不太了解它或如何解决它:
|
39 | for barn in &self.barns {
| ----------- this iterator yields `&` references
...
42 | barn.animals.push(animal);
| ^^^^^^^^^^^^ `barn` is a `&` reference, so the data it refers to cannot be borrowed as mutable
解决方案
在阅读了 for 循环中的可变借用之后,看起来这是解决方案:
fn place_animal_in_barn(&mut self, animal: Animal<'a>, placement: &str) {
for barn in &mut self.barns {
if barn.name == placement {
barn.animals.push(animal);
}
}
}
推荐阅读
- c++ - 如果 std::optional 的 bool 转换运算符是显式的,为什么我们可以使用 optional 作为 if 语句的条件?
- django - 如何使用 Django 模拟 POST 到 URL
- openfst - OpenFST - 从单词列表中创建 FST
- reactjs - 如何在 React 中的 Leaflet.js 上显示 d3 中的 json
- href - 从具有数据编码 URL 的锚点中提取 URL
- javascript - 如何在 Oracle APEX 19+ 中创建自定义“自定义”前端?
- javascript - 如何创建自动播放徽标轮播?
- python - 如何通过摄像头实时跟踪对象并提取它的 x 和坐标?
- php - Laravel Collection 不会提取价值
- azure-active-directory - DisplayControl - 验证电子邮件未使用 - Azure AD B2C