我已经在这里停留了一段时间,并且无法弄清楚如何使字段word
变得可变。有人可以在这里指出我的问题。
pub struct Person<'name>{
name:&'name Name
}
pub struct Name{
word: String
}
impl<'name> Person<'name>{
pub fn new(name:&'name mut Name)-> Person<'name>{
Person {
name: name
}
}
}
fn main(){
let mut name: Name = Name {
word: String::from("Petre")
};
let mut person: Person = Person::new(&mut name);
first(&mut person);
}
pub fn first(person:&mut Person){
person.name.word = String::from("Wurst");
second(person);
}
pub fn second(person:&mut Person){
println!("{}",person.name.word)
}
输出
error: cannot assign to immutable field `person.name.word` --> main.rs:27:5 | 27 | person.name.word = String::from("Wurst"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
答案 0 :(得分:7)
查看您的Person
结构:
pub struct Person<'name>{
name:&'name Name
}
name
字段是不可变引用,因此您无法通过它进行书写。只需将其作为可变参考:
pub struct Person<'name>{
name:&'name mut Name
}
答案 1 :(得分:2)
答案 2 :(得分:1)
我认为由于您为person.name
实现new()
方法的方式,您希望Person
是可变的,其中name
参数是对{的可变引用{1}} struct:
Name
但这只意味着函数参数必须是一个 - 它不会导致目标fn new(name: &'name mut Name)
的字段可以变异。你可以将一个可变引用传递给期望不可变引用的目标,但你不能反过来这样做;你会收到Person
错误。
正如其他人正确指出的那样,该字段需要明确标记为values differ in mutability
才能使其具有可变性:
mut