홈>
먼저
&mut
의 차이점이 무엇인지 묻지 않습니다.
그리고
ref mut
그 자체로.
내가 생각하기 때문에 묻는다 :
let ref mut a = MyStruct
와 동일
let a = &mut MyStruct
함수에서 특성 객체를 반환하는 것을 고려하십시오. 당신은
Box<Trait>
를 반환 할 수 있습니다
또는
&Trait
. 메소드에 변경 가능하게 액세스하려면
&mut Trait
를 리턴 할 수 있습니까?
?
이 예를 들면 :
trait Hello {
fn hello(&mut self);
}
struct English;
struct Spanish;
impl Hello for English {
fn hello(&mut self) {
println!("Hello!");
}
}
impl Hello for Spanish {
fn hello(&mut self) {
println!("Hola!");
}
}
이 방법은 데모 목적으로 변경 가능한 참조를받습니다.
이 컴파일되지 않습니다 :
fn make_hello<'a>() -> &'a mut Hello {
&mut English
}
이것도 :
fn make_hello<'a>() -> &'a mut Hello {
let b = &mut English;
b
}
그러나 이것은 컴파일되고 작동합니다 :
fn make_hello<'a>() -> &'a mut Hello {
let ref mut b = English;
b
}
내 이론
이 예제는 불변의 참조가있는 상자에서 즉시 작동합니다 (변수에 할당 할 필요는 없으며&English
만 반환하십시오)
)이지만 변경 가능한 참조는 없습니다. 이것은 하나의 변경 가능한 참조 또는 원하는만큼 변경할 수없는 규칙이 있기 때문이라고 생각합니다.
불변의 참조의 경우, 객체를 작성하여이를 리턴 표현식으로 차용합니다. 참조가 빌려서 죽지 않습니다.
변경 가능한 참조의 경우, 객체를 생성하고이를 리턴 표현식으로 변경 가능하게 빌리려고하면 두 개의 변경 가능한 참조 (생성 된 오브젝트 및 해당 참조)가 있습니다. 동일한 객체에 대해 두 개의 변경 가능한 참조를 가질 수 없으므로 두 번째를 수행하지 않으므로 변수가 오래 살지 않습니다. 난 당신이
let mut ref b = English
를 쓸 때 생각
b
를 반환
변경 가능한 참조가 패턴에 의해 캡처 되었기 때문에이동합니다.
위의 모든 것이 왜 그것이 효과가 있는지 설명하려고하는 것은 아니지만, 그것을 증명할 기본은 없습니다.
왜 이런 일이 발생합니까?
저는 이 질문을 Reddit에 게시했습니다 .
- 답변 # 1
관련 자료
- rust - ʻimpl trait for t where t - trait2`와 ʻimpl trait for dyn trait2`의 차이점
- python - var = fun ()과 var = fun의 차이점
- sql server - 현재 레코드의 종료 시간과 다음 레코드의 시작 시간의 차이가 x 분 미만인 T-SQL의 레코드 통합
- javascript - ReactJS에서 기능을 정의하는 동안 paranthesis와 paranthesis 내에서 중괄호 만 사용하는 것의 차이점은 무엇입니까?
- c++ - begin ()과 data ()의 차이점은 무엇입니까?
- ansible과 ansible-playbook 명령 실행의 차이점은 무엇입니까?
- r - 스플라인 모델에 대한 glmnb의 정상적인 실행과 glmnb의 geom_smooth 실행의 차이
- shell - 일반 문자열과 변수의 문자열의 차이점은 무엇입니까
- Scala에서 Class와 Classtype의 차이점
- 가정과 상업용 건물의 액세스 포인트에 차이가 있습니까?
- Python의 함수와 C ++의 함수의 차이점은 무엇입니까?
- c++11 - (* it) first와 it-> first의 차이점은 무엇입니까?
- unity - public int와 int의 차이점은 무엇입니까?
- c++ - : invocable과 std :: regular_invocable 개념의 차이점은 무엇입니까?
- ResourcesLoad에서 참조 VS에서 자산 프리 팹에 액세스하는 것의 Unity 차이점은 무엇입니까?
- Bigquery에서 두 행의 차이점
- C에서 while 루프와 for 루프의 차이로 인해 출력 차이가 발생합니다
- python - fit, transform 및 fit_transform의 차이점 (Scikit Learn)
- python - 다른 목록에 대한 규칙 세트에 따라 한 목록에서 두 위치의 차이
- amazon web services - AWS에서 계정 이름과 사용자 이름의 차이점은 무엇입니까?
관련 질문
- Rust: 유형과 참조를 모두 사용하여 연산자 오버로딩
- 추출된 함수의 반환 유형이 특성 측면에서 정의된 경우 Rust에서 함수의 일부를 추출하려면 어떻게 해야 합니까?
- generics : 특정 유형에 대한 녹을 제네릭
- generics : 녹 중에서 &&mut [char]의 요소를 어떻게 수정합니까?
- rust : 파일의 특성을 올바르게 사용하려면 해당 구현과 별도의 특성을 올바르게 사용합니까?
- rust :
특성 바인드를 만족시킬 수 없습니다 - rust : 관련 유형이 특성 객체 참조 컬렉션에 지정되어야하는 이유는 무엇입니까?
- rust : 수명과 소유권
- rust : "자아"와 eLied 수명 사이에 다른 것
- multithreading : 백그라운드 작업에서 특성 개체 사용 (다른 스레드)
이것은 버그입니다. 아래의 원래 분석은변경 가능참조를 반환한다는 사실을 완전히 무시했습니다. 프로모션 관련 내용은불변값의 맥락에서만 의미가 있습니다. <시간>
임시를 관리하는 규칙 (강조 광산)의 미묘한 차이로 인해 가능합니다 :
와이즈 비즈 와이즈 비즈 .참조는 계속됩니다 :
와이즈 비즈 와이즈 비즈 슬롯은 런타임 동작을 변경하지 않고 표현식이 원래 작성된 위치에서 빌린 상수를 빌리고 빌린 다음 역 참조 할 수있을 때 발생합니다. 즉, 승격 된 표현식은 컴파일 타임에 평가할 수 있으며 결과 값은 내부 변경 가능성 또는 소멸자를 포함하지 않습니다 (이러한 특성은 가능한 경우 값을 기반으로 결정됩니다 (예 :세 번째 사례는