Upgrade to Pro — share decks privately, control downloads, hide ads and more …

その式、値ですか?場所ですか?

Masaki Hara
January 16, 2019

 その式、値ですか?場所ですか?

他の多くの手続き型言語と同様、Rustの式も右辺値(値)か左辺値(場所)のどちらかに分類されます。この値・場所にまつわる事実を整理してみました。この区別は決して難しいわけではないですが、整理して言語化することで、今後のRustプログラミングをより快適にすることができるかもしれません。

Masaki Hara

January 16, 2019
Tweet

More Decks by Masaki Hara

Other Decks in Programming

Transcript

  1. 11 2019/1/16 その式、値ですか?場所ですか? デフォルトのモード • 残りの式はデフォルトで値である f 定数、関数、コンストラクタ A 関数・メソッド呼出

    e.f() 各種リテラル・クロージャ f() A{} 42 "s" () (e,e) e..e [e;n] [e,e] 代入・複合代入 ||e x = e x += e アドレス演算子 &e 各種演算子 (&, *以外) -e e + e box e インラインアセンブリ e as T asm!() ブロック系構文 制御構文 {} if while for loop match unsafe try async return break continue yield e? このリストのうちいくつかはそもそも戻り値に深い意味 がない (! や () 型になる) let も同様だが、こいつは式ですらない
  2. 13 2019/1/16 その式、値ですか?場所ですか? • では、次のような場合は? let x = 42; &42

    + x Expect: 場所 Got: 値 Expect:値 Got: 場所 欲しいものが違うときは変換がはさまるはず
  3. 17 2019/1/16 その式、値ですか?場所ですか? 値が欲しいときの変換 • 場所なのに値が欲しいときは、読み取り動作 (コピーまたは ムーブ) が発生する x

    read(&x) 実際にはムーブ元のインバリデーションが必要なのでこのよう な単純化はできないが、コピーのときはこのように考えてし まって問題ない
  4. 22 2019/1/16 その式、値ですか?場所ですか? パターンマッチにも値と場所がある • マッチ対象の式のモード = パターンのモード if let

    Some(ref mut s) = s { s.push_str("world!"); } if let Some(s) = s { eprintln!("{}", s); } 場所に対するマッチング 値に対するマッチング let, match, if let, while let で共通して現れる現象。 引数と for 文の場合は必ず値が渡ってくる
  5. 23 2019/1/16 その式、値ですか?場所ですか? 例: Optionの場所マッチ • Optionのヘルパー関数はほとんどが値マッチで、場所マッチを するのは以下の関数のみ get_or_insert_with get_or_insert

    iter_mut iter as_mut as_ref is_some is_none take, replace はやや特殊で、 こいつらはそもそもマッチングをしていない 普遍的な場所マッチヘルパー
  6. 38 2019/1/16 その式、値ですか?場所ですか? Unsized Rvalues (RFC1909, nightly) • 値として使われる式でも、条件次第でunsizedで あることを許す

    • 主な動機は2つ: • Box<dyn FnOnce()> 等の値渡しオブジェクトの実 現 • [e; dyn n]: allocaに相当する処理
  7. 39 2019/1/16 その式、値ですか?場所ですか? Unsized Rvalues (RFC1909, nightly) • qnighyが実装しました! •

    #51131: 基本的なサポート • #54183: fn(self) をオブジェクト安全にする • まだやることは色々ある • 詳しくはまた別の機会に…… #![feature(unsized_locals)] fn foo(f: dyn FnOnce()) { f(); }
  8. 40 2019/1/16 その式、値ですか?場所ですか? まとめ • 値/場所にまつわる性質の整理を試みた。 • Fact1: 式には値と場所がある •

    Fact2: 暗黙変換は意識するに値する • Fact3: パターンマッチにも値と場所がある • Fact4: 字句的にわからないケースもある • Fact5: 場所として脱糖される式がある • Fact6: unsizedな値もある