2016-10-06 17 views
1

Я застрял здесь некоторое время и не могу понять, как сделать поле 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"); 
    |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
+2

Это не изменяемые, потому что вы конкретно сказали, что это не должно быть изменяемым. Есть ли причина, по которой вы не можете просто использовать '& 'name mut Name'? ** Редактировать **: также вы не изменяете поля; поле изменено или не зависит от того, как вы его достигаете, и в этом случае вы достигаете его через 'Person.name', который является неизменным указателем. –

ответ

2

Помечая поле изменяемый справки:

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

Playground

7

Глядя на ваш Person структуры:

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

Поле name является неизменны ссылка, так что вы не можете написать через него. Просто сделайте это изменяемую ссылку:

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

(playground)

1

Я думаю, что вы ожидали person.name быть изменяемыми в связи с тем, как вы реализован методом new() для Person, где name аргумента является изменяемой ссылкой Name структура:

fn new(name: &'name mut Name) 

Но это только означает, что аргумент функции должен быть один - это не приведет к фа ct, что поле цели Person может быть мутировано. Вы можете передать измененную ссылку на цель, ожидающую неизменной ссылки, но вы не можете сделать это наоборот; вы получите ошибку values differ in mutability.

Как другие правильно указали, поле должно быть явно помечена как mut возможность для того, чтобы позволить ее переменчивость:

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