2017-12-20 11 views
2

뭔가 컴파일하고 잘 실행 :컨테이너의 멤버가 가변성을 상속합니까? 이 같은

#[derive(Clone)] 
struct Member { 
    x: i32, 
} 

fn main() { 
    let mut arr = vec![Member { x: 5 }; 5]; 

    arr[0].x = 25; 

    println!("{}", arr[0].x); // Gives 25 
} 

Vec가 가변되어 같은 컨테이너에 대한 참조는 다음 요소가 가변성을 "상속"때문에 경우인가?

+2

'IndexMut''의 Vec'의 구현은'& MUT VEC 을'걸리고'& MUT T'를 반환합니다. – Veedrac

+1

'BTreeSet'과'HashSet'을 고려하십시오 - 그들은 항상 불변 인 멤버를가집니다. 'arena '(https://docs.rs/typed-arena/1.3.0/typed_arena/index.html) 상자)는 요소에 대한'& mut '참조를 전달하는 데이터 구조이지만 '& Arena'만이 그렇게 할 수 있습니다. – trentcl

답변

2

일반적으로 가변성은 변수의 바인딩에 따라 유형 필드에 의해 "상속"됩니다. 에서 녹 프로그래밍 언어chapter on defining structs :

인스턴스가 변경 가능한 경우

, 우리는 특정 필드

[...]

로 점 표기법을 사용하고 할당하여 값을 변경할 수 있습니다 전체 인스턴스가

그러나 변경 가능합니다

주, 즉 여기에서 무슨 일이 일어나고 있지 있는지. Veedrac points out in the comments으로 컨테이너의 필드에 액세스하지는 않지만 메소드를 호출하고 있습니다.

[] 운영자가 IndexMut trait에 의해 제공됩니다 :

pub trait IndexMut<Idx>: Index<Idx> 
where 
    Idx: ?Sized, 
{ 
    fn index_mut(&mut self, index: Idx) -> &mut Self::Output; 
} 

귀하의 코드에 가깝다 뭔가 번역이 경우, 아무것도 "상속 없다"됩니다에서

{ 
    let tmp: &mut Member = IndexMut::index_mut(&mut arr, 0); 
    tmp.x = 25; 
} 

, 그것은 명시 적으로 통해 부여 된 것 메소드 구현.

은 참조 :