2016-10-06 4 views
1

Ich stecke hier seit einiger Zeit fest und kann nicht herausfinden, wie man das Feld word veränderbar macht. Kann mir bitte jemand das Problem hier aufzeigen?Wie kann dieses Feld veränderbar gemacht werden?

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) 
} 

Output

error: cannot assign to immutable field `person.name.word` 
    --> main.rs:27:5 
    | 
27 |  person.name.word = String::from("Wurst"); 
    |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
+2

Es ist nicht wandelbar, weil Sie ausdrücklich gesagt, dass es nicht wandelbar sein sollte. Gibt es einen Grund, warum du '& 'name mut Name' nicht einfach benutzen kannst? ** Edit **: Auch machen Sie keine Felder veränderbar; Ein Feld ist veränderbar oder nicht abhängig davon, wie Sie es erreichen, und in diesem Fall erreichen Sie es über 'Person.name', was ein unveränderlicher Zeiger ist. –

Antwort

2

durch das Feld als änderbare Referenzmarkierung:

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

Playground

7

Blick auf Ihrer Person struct:

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

Das name Feld eine unveränderlich Referenz, so kann man durch sie nicht schreiben. machen es einfach eine veränderbare Referenz:

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

(playground)

1

Ich glaube, Sie person.name wandelbar zu erwarten aufgrund der Art und Weise Sie die new() Methode für Person implementiert, wobei das name Argument ist ein veränderliches Verweis auf eine Name Struktur:

fn new(name: &'name mut Name) 

das bedeutet aber nur das Funktionsargument zu sein braucht - es führt nicht in den fa ct, dass das Zielfeld Person mutiert werden kann. Sie können eine veränderbare Referenz an ein Ziel übergeben, das eine unveränderliche Referenz erwartet, aber Sie können es nicht anders herum tun; Sie würden einen values differ in mutability Fehler erhalten.

Wie die andere zu Recht darauf hingewiesen, muss das Feld explizit als mut der Lage, um markiert werden, um seine Veränderlichkeit zu ermöglichen:

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