2014-11-19 3 views
39

Как я могу мутировать поле структуры из метода?Как мутировать поле структуры в методе

Я хочу сделать это

struct Point { 
    x: int, 
    y: int, 
} 

impl Point { 
    fn up(&self) { 
     self.y += 1; 
    } 
} 

fn main() { 
    let p = Point { x: 0, y: 0 }; 
    p.up(); 
} 

Но этот код броска компиляции ошибка:

/src/main.rs:8:3: 8:14 error: cannot assign to immutable field `self.y` 
/src/main.rs:8    self.y += 1; 

ответ

53

Вы должны использовать &mut self вместо &self:

struct Point { 
    x: int, 
    y: int, 
} 

impl Point { 
    fn up(&mut self) { 
     self.y += 1; 
    } 
} 

fn main() { 
    let mut p = Point { x: 0, y: 0 }; 
    p.up(); 
} 

ржавчиной, Изменчивость является inherited: владелец данных решает, является ли значение изменчивым или нет. Однако ссылки не подразумевают права собственности, и, следовательно, они могут быть неизменными или изменяться. Вы должны прочитать official book, в котором объясняются все эти основные понятия.

+3

Это 'let p' должно быть' let mut p', чтобы разрешить изменчивый заимствовать. Я попытался исправить это, но Stackoverflow хочет, чтобы изменения составляли не менее 6 символов. – Sgeo

+0

@Sgeo, спасибо, пропустил! –

+4

@VladimirMatveev Я просто хочу сказать, что, даже если вы читали и работали над книгой, никогда раньше не замечая этих концепций, это может не иметь особого смысла, пока вы не столкнетесь с реальной ситуацией, когда это уместно. Как это было для меня, так что эти ответы по-прежнему очень полезны;) – Aeolun