녹에서는 기본적으로 바인딩을 변경할 수 없습니다. 당신이 밖으로 발견이 매우 그렇지 않다,
List<int> list = new List<int>(); // C#
let mut list = Vec::new(); // Rust
그러나 :
readonly List<int> list = new List<int>(); // C#
let list = Vec::new(); // Rust
그리고 이들을 : 그래서 당신은 다음과 동일하다는 것을 생각할 수 있습니다.
C# 버전의 Add
메서드 안에는 호출하는 데 사용한 바인딩에 대한 정보가 없습니다. Add
메서드는 C# 컴파일러에서 readonly
바인딩에 대한 참조를 전달하지 못하도록 데이터를 변경한다고 선언 할 수 없습니다. readonly
키워드는 list
바인딩을 완전히 새로운 List
으로 덮어 쓰지 못하도록하지만, 사용자가 가지고있는 데이터의 변경을 막을 수는 없습니다. C#을 사용하면 readonly
바인딩 값을 변경할 수 없지만이 경우 값은 데이터 자체가 아니라 데이터를 가리키는 포인터입니다.
녹이면 메소드가 기본 데이터를 변경해야하는 경우 첫 번째 인수를 self
또는 으로 선언해야합니다.
self
의 경우 데이터는 으로 변경되어으로 옮겨지고 더 이상 원본 제본을 사용할 수 없습니다. 호출자가 더 이상 바인딩을 사용할 수 없기 때문에 메서드가 데이터를 변경하는지는 중요하지 않습니다.
변경 가능한 참조 인 경우 &mut self
의 경우 Rust는 원본 바인딩도 변경할 수있는 경우에만 만들 수 있습니다. 원래 바인딩이 불변 인 경우 컴파일 오류가 발생합니다.push
이 을 예상하기 때문에 v.push
을 v
이 불변 일 경우 호출 할 수 없습니다.
제한적일 수 있으므로 Rust는 필요한 안전성을 정확히 인코딩하기 위해이 동작을 미세 조정할 수있는 도구를 제공합니다. C# 동작에 가까운 것을 얻으려면 RefCell
래퍼 (또는 다른 여러 래퍼 유형 중 하나)를 사용할 수 있습니다. RefCell<Vec<T>>
자체가 기능을 풀어서 내부의 Vec
을 수정할 수 있도록 변경할 수 있어야합니다.