>

먼저 &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

    이것은 버그입니다. 아래의 원래 분석은변경 가능참조를 반환한다는 사실을 완전히 무시했습니다. 프로모션 관련 내용은불변값의 맥락에서만 의미가 있습니다. <시간>

    임시를 관리하는 규칙 (강조 광산)의 미묘한 차이로 인해 가능합니다 :

    와이즈 비즈 와이즈 비즈 .

    참조는 계속됩니다 :

    와이즈 비즈 와이즈 비즈  슬롯은 런타임 동작을 변경하지 않고 표현식이 원래 작성된 위치에서 빌린 상수를 빌리고 빌린 다음 역 참조 할 수있을 때 발생합니다. 즉, 승격 된 표현식은 컴파일 타임에 평가할 수 있으며 결과 값은 내부 변경 가능성 또는 소멸자를 포함하지 않습니다 (이러한 특성은 가능한 경우 값을 기반으로 결정됩니다 (예 :

    When using an rvalue in most lvalue contexts, a temporary unnamed lvalue is created and used instead,if not promoted to )).  항상 'static 유형이 있습니다 허용되지 않는 것이 포함되어 있기 때문입니다.

    세 번째 사례는

    Promotion of an rvalue expression to a 가 "증명"하기 위해 다시 작성 될 수 있습니다.  프로모션 진행 중 :

    'static
    
    
    &None 에 대한  이것을 허용하고 &'static Option<_>  내 최고의 추측은 'static 입니다  프로모션은 최선을 다하고 있으며 fn make_hello_3<'a>() -> &'a mut Hello { let ref mut b = English; let c: &'static mut Hello = b; c }  수표가 무엇이든 잡히지 않습니다. 상황을 설명하는 문제를 찾거나 제기 할 수 있습니다.

    ref mut

관련 자료

  • 이전 mysql - union 2 sql 쿼리 - wp_posts 및 wp_terms :php, 워드 프레스
  • 다음 python - kivy - 버튼 삭제시 'nonetype'오브젝트를 호출 할 수 없음