読者です 読者をやめる 読者になる 読者になる

ここは俺の備忘録だ

少なくとも日本語での言及が少ない話をするつもりです

Rustのreference/dereferenceまとめ

この記事は TUT Advent Calendar 2016 - Adventar 5日目の記事です.

3日目の記事: 5mmくらいわかる競馬講座~国庫から出金~(CC他 - 自分用

(@naruhodo2015さんへ: Rustは関数型プログラミング言語では無いですよ ><)

最近,友人et al.と適当な映像を垂れ流しながらもくもくと作業する会が不定期で開かれる様になりました.そこでRustを書いていた友人曰く「Rustのreference/dereferenceの対応とその演算子がわかりにくい」との事で,まとめてAdCに貼ることに.

f:id:Nnwww:20161205002404j:plain

(mut &になってるのは徹夜で脳死していた影響です (´・_・`))

一番わかりにくいのはLHSとRHSに現れる&の役割が異なる事です.LHSで登場する「パターン」では参照の付加をrefパターンで行えるようになっており, let ref x = ...等とすると右辺の評価結果に参照を付加した物をxとして束縛します.一方でdereferenceを行うのが&xパターンで,これはref xと比べれば自然な使われ方でしょう. ある値xの参照が入ってくるので,&xに分解されると考える訳です.

RHSで登場するのは単項演算子である事に注意します.するとこれがC/C++に由来するreference/dereferenceの記法である事が分かると思います.

構造体に結び付くメソッド構文の場合,参照を打ち消すようにdereferenceが行われます*1.実用では参照が付加される関数がどれなのか(iterなど),ライフタイムがある場合はどの引数に基づくのか*2,use after freeが起きる場合スコープをどう限定するかなどなどを気にしつつreference/dereferenceの対応を取っていく必要があります.コンパイラと協力しながらdata race安全なコードを詰めていくプログラミングがRustの醍醐味でありつらみでもあるわけですね.

filterのように,イテレータには二重に参照を付加して述語へ渡してくるものが幾つかありますが,この理由は分かっていません.詳しい型がいらっしゃったら是非コメント宜しくお願いします.

それでは,皆さん良いRustプログラミングを!

6日目は @jp3cyc さんの Ogaki Mini Maker Fairに行ってきた | jp3cyc's blog です.

*1:`Deref` による型強制

*2:HashMap等,使い回しが起きる所で重要になります.e.g. コンテナの値を取って→入れて→エラー (lifetimeとかの話) - Qiita