自分用】Rust 4.7 所有権を写経しているときのつぶやき

2
ちゃまぐ @tyamaguc07

■ 所有権前説 所有権こそが、Rust最大の目標「メモリ安全性を得る」ための方法 「所有権」「借用」「参照」「ライフタイム」という概念がある ■ ゼロコスト抽象化 Rustの安全性とスピードは「ゼロコスト抽象化」によって成し遂げられる 所有権システムは「ゼロコスト抽象化」の主な例

2018-12-29 19:21:38
ちゃまぐ @tyamaguc07

■ 所有権概論 Rustを学び始めたユーザは、「借用チェッカとの戦い」と好んで呼ばれる経験をする Rustコンパイラは、開発者が*正しいと考える*プログラムをコンパイルすること拒絶する 所有権がどのように機能するかについてのプログラマのメンタルモデルと実際のRustの実装がマッチしないため

2018-12-29 19:21:38
ちゃまぐ @tyamaguc07

Rustの所有権システムのルールとしばらく仕事をすれば、借用チェッカとの戦いは少なくなっていく。安心しよう。 ■ 所有権 Rustの変数束縛は、束縛されているものの「所有権を持つ」という特性がある 束縛がスコープから外れるとき束縛されているリソースを開放する. ヒープ割当のメモリであっても。

2018-12-29 19:21:39
ちゃまぐ @tyamaguc07

- 所感1 - 翻訳版だと4.7で所有権だが、オリジナルは4.7はベクタが来ている。 これは、ベクタがヒープ上にアロケーションすることを知った上で、所有権を学んだほうが有用だからだと思う。 所有権の最初のサンプルがベクタを使ったものだが、これだけみても何が想定と違うのかは分かりづらい。

2018-12-29 19:21:39
ちゃまぐ @tyamaguc07

- 所感2 - とはいえ、ヒープとスタックの違いも理解していないと理解は難しい。 C言語でヒープを使う際は、mallocを使う必要があり使い終わったあとは明示的にfreeを行わなければならない。 Rustでは、ヒープ割当を行う変数束縛であってもスコープから外れると自動的に開放される

2018-12-29 19:21:39
ちゃまぐ @tyamaguc07

Rustにおいて与えられたリソースに対する所有権を持つ変数束縛は1つに限られる。 変数束縛から異なる変数束縛に値を代入すると、所有権も移行される。 これは、関数に値を渡す場合も同じである。 所有権をなにか別のものに転送するとき、参照するものを「ムーブした」と表現する。

2019-01-04 23:15:42
ちゃまぐ @tyamaguc07

ムーブされた束縛を使えなくなるのは、重要な意味を持つ。 もし、使える状態となれば束縛が参照するポインタが複数存在することになる これはデータ競合が存在しないことを保証するRustにはあってはならないこととなる

2019-01-04 23:15:43
ちゃまぐ @tyamaguc07

さて、ここまでやって、ヒープやスタックという言葉が強調されていることに違和感を感じた。 この所有権の話はヒープ領域を使う束縛に限った話なのではないかという仮説が出てきた。

2019-01-04 23:15:43
ちゃまぐ @tyamaguc07

というわけで、サンプルで使われていた束縛をヒープを使うVecからスタックのみで完結するi32に変えて動かすと… コンパイルは無事に通り動いてしまった。なるほど。 ぐぐってみたら、以下の記事が分かりやすくまとまっていた。 qiita.com/kakaka19/items…

2019-01-04 23:15:43
ちゃまぐ @tyamaguc07

こちらの記事もこれまで触って理解していた内容が端的にまとまっている blog.waft.me/2017/09/24/rus…

2019-01-04 23:15:43