如何使这个领域变得可变?

时间:2016-10-06 05:40:27

标签: struct rust mutability

我已经在这里停留了一段时间,并且无法弄清楚如何使字段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");
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

3 个答案:

答案 0 :(得分:7)

查看您的Person结构:

pub struct Person<'name>{
    name:&'name Name
}

name字段是不可变引用,因此您无法通过它进行书写。只需将其作为可变参考:

pub struct Person<'name>{
    name:&'name mut Name
}

playground

答案 1 :(得分:2)

将该字段标记为可变引用:

pub struct Person<'name>{
    name:&'name mut Name
} //            ^^^ mutable

Playground

答案 2 :(得分:1)

我认为由于您为person.name实现new()方法的方式,您希望Person是可变的,其中name参数是对{的可变引用{1}} struct:

Name

但这只意味着函数参数必须是一个 - 它不会导致目标fn new(name: &'name mut Name) 的字段可以变异。你可以将一个可变引用传递给期望不可变引用的目标,但你不能反过来这样做;你会收到Person错误。

正如其他人正确指出的那样,该字段需要明确标记为values differ in mutability才能使其具有可变性:

mut