Notice
Recent Posts
Recent Comments
NeuroWhAI의 잡블로그
[Rust] Auto-Dereferencing Rules (자동 역참조 규칙) 본문
위 글을 공부하여 정리한 글입니다.
Rust에서 x.bar()처럼 메소드를 호출하는건 T::bar(x)와 같은데 이때 bar의 self와 x가 일치하지 않으면 auto-dereferencing rules이 수행됩니다.
설명하기 전에 단어, 문자 용어 정리하고 하겠습니다.
Receiver type : 메소드의 self 타입 (Self가 Foo이고 fn bar(&self);라면 &Foo가 됩니다. Self가 &Foo이고 fn bar(self);여도 &Foo.)
x : 메소드의 self로 들어갈 값
T : x의 타입
U : 각 역참조 단계에서의 타입. 처음엔 T였다가 단계를 거칠때마다 역참조가 하나씩 붙어서 *T, **T, ***T, ...가 됩니다.
1. Receiver type이 U와 일치하는지 확인하고 일치한다면 U로 호출한다.
2. 일치하지 않는다면 '&'나 '&mut'를 하나 붙히고 Receiver type과 일치하는지 확인하고 일치한다면 그렇게 호출한다.
3. '1', '2' 모두 실패했다면 역참조(U = *U)를 한 번 더 수행하고 1번으로 돌아간다. 역참조를 더이상 수행할 수 없다면 실패한다.
2번에서 &를 붙힐지 &mut을 붙힐지는 Receiver type을 보고 결정합니다.
Receiver type이 Foo, &Foo처럼 immutable이면 &를 붙히고
mut Foo, &mut Foo처럼 mutable이면 &mut을 붙힙니다.
2번에서 굳이 &를 하나 붙혀보는 이유는 Rust의 Deref coercions을 발동(?)하기 위한 단계입니다.
슈도코드로 적자면 대략 아래의 모습이 되겠죠.
R = Receiver typeU = Twhile (!Error):if (R == U):Call with Ubreakelse if (R == &U):Call with &Ubreakelse:U = *U
예를 들어서 Receiver type이 &Foo이고 x의 타입 T가 &mut Foo라고 해봅시다.
1번에서 두 타입이 같지 않으므로 2번으로 넘어가고
2번에서 x에 &를 붙혀도 &x는 &&mut Foo로 일치하지 않죠.
3번에서 역참조를 한번 수행하면 *x가 되고
다시 1번에서 두 타입이 여전히 &Foo != &&mut Foo이므로
2번에서 *x에 &를 붙히게 되는데 &*x가 되어 &Foo와 일치하게 됩니다. (&mut이 아니라 &를 붙혀줬다는게 중요)
'개발 및 공부 > 언어' 카테고리의 다른 글
[C++] 기본 인수(Default arguments) 고급 (0) | 2018.08.04 |
---|---|
[Kotlin] 헬로, 코틀린! (0) | 2018.08.04 |
[Rust] &mut T -> &T 변경하기 (0) | 2018.07.27 |
[C++] ADL(Argument Dependent Lookup) 혹은 Koenig Algorithm 설명 (0) | 2018.06.23 |
[JavaScript] replace all (0) | 2018.06.19 |
Comments