2016-10-06 5 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'を使うだけの理由はありますか? ** Edit **:フィールドを変更することもできません。フィールドはあなたがどのようにそれに到達するかに依存して変更可能であるかどうかは不明です。この場合、不変のポインタである 'Person.name'を介してフィールドに到達します。 –

答えて

2

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

Playground

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

nameフィールドが不変参照ですので、あなたはそれを書くことはできません:あなたのPerson構造体を見てみます。私はあなたが原因あなたはname引数はへの変更可能な参照であるPersonためnew()方法を、実装方法にperson.nameが可変であることが予想考える

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

playground

1

:単に可変参照しますName構造体:

fn new(name: &'name mut Name) 

しかし、これが唯一の関数の引数を1にする必要があること - それがFAにはなりません。ターゲットPersonのフィールドを変更することができます。不変の参照を期待しているターゲットに変更可能な参照を渡すことはできますが、他の方法でそれを行うことはできません。 values differ in mutabilityというエラーが発生します。

他の人が正しく指摘したように、フィールドには、明示的に可変性を可能にするためにできるmutとしてマークする必要があります

struct Person<'name>{ 
    name: &'name mut Name 
} 
関連する問題