NeuroWhAI의 잡블로그

[Rust] Auto-Dereferencing Rules (자동 역참조 규칙) 본문

개발 및 공부/언어

[Rust] Auto-Dereferencing Rules (자동 역참조 규칙)

NeuroWhAI 2018. 7. 27. 21:25


위 글을 공부하여 정리한 글입니다.


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 type
U = T
while (!Error):
    if (R == U):
          Call with U
          break
    else if (R == &U):
          Call with &U
          break
    else:
          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이 아니라 &를 붙혀줬다는게 중요)




Comments