Rust で自動でデリファレンスされるやつのメモ2
Rustには->演算子の代わりとなるようなものはありません; その代わり、Rustには、 自動参照および参照外しという機能があります。Rustにおいてメソッド呼び出しは、 この動作が行われる数少ない箇所なのです。
動作方法はこうです: object.something()とメソッドを呼び出すと、 コンパイラはobjectがメソッドのシグニチャと合致するように、自動で&か&mut、*を付与するのです。 要するに、以下のコードは同じものです:
p1.distance(&p2);
(&p1).distance(&p2);
let s = "foo".to_string(); let ss = &s; let sss = &ss; assert_eq!(3, sss.len()); assert_eq!(3, (***sss).len());
今日得た学びとしては、usize 型の + (std::ops::Add) は、usize を返すので、&usize を使ってるときの配列やベクタの添え字(usize が必要となる)でこんな感じになった。
let v: Vec<u32> = vec![11, 22, 33, 44, 55]; let i: usize = 3; let j = &i; assert_eq!(44, v[*j]); // j は &usize 型だから、添え字にできず、* のデリファレンスが要る assert_eq!(55, v[j + 1]); // (*j).add(1) で 新規の usize 型の値が返ってくるのでそれがそのまま添え字になる
手動でのデリファレンスが必要だったり不要だったりした。