Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

Rust で自動でデリファレンスされるやつのメモ2

https://doc.rust-jp.rs/book-ja/ch05-03-method-syntax.html#-%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%AF%E3%81%A9%E3%81%93%E3%81%AB%E8%A1%8C%E3%81%A3%E3%81%9F%E3%81%AE

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 型の値が返ってくるのでそれがそのまま添え字になる

手動でのデリファレンスが必要だったり不要だったりした。