2017-12-11 31 views
2

나는 구조체가 :특정 구조체 필드 만 변경할 수 있습니까?

pub struct Test { 
    pub x: i32, 
    pub y: i32, 
} 

내가하는 기능을 가지고 싶습니다을 즉,이 변이합니다 - 쉬운 :

pub fn mutateit(&mut self) { 
    self.x += 1; 
} 

mutateit의 함수 호출 기간 동안 전체 구조체 변경 가능하게 , 맞지? I 에만 x을 돌연변이시키고 싶습니다. y을 돌연변이시키고 싶지 않습니다. x을 변경할 수있는 방법이 있습니까?

답변

3

The Book를 인용 :

struct Point { 
    mut x: i32, // This causes an error. 
    y: i32, 
} 

당신이 필요로하는 내부 가변성, 잘 설명 :이 같은 것을 쓸 수 있도록

녹, 언어 수준에서 필드의 가변성을 지원하지 않습니다 in the standard docs :

use std::cell::Cell; 

pub struct Test { 
    pub x: Cell<i32>, 
    pub y: i32 
} 

fn main() { 
    // note lack of mut: 
    let test = Test { 
     x: Cell::new(1), // interior mutability using Cell 
     y: 0 
    }; 

    test.x.set(2); 
    assert_eq!(test.x.get(), 2); 
} 

그리고 함수에 통합하고 싶다면 :

impl Test { 
    pub fn mutateit(&self) { // note: no mut again 
     self.x.set(self.x.get() + 1); 
    } 
} 

fn main() { 
    let test = Test { 
     x: Cell::new(1), 
     y: 0 
    }; 

    test.mutateit(); 
    assert_eq!(test.x.get(), 2); 
}