Eukleides project

from http://d.hatena.ne.jp/u5_h/

Rustを勉強中2

前回の続き

    • 所有権と参照とライフタイム
      • 所有権

Rustでは値を使うとなくなるが、実際はソースの所有権が、別の所有者に移る。
右式の変数が以降で使えなくなる。
左式の変数がソース"this is a resource"の所有権をもつ

fn main() {
let s = "this is a resource".to_string();
// 以下の行で、`s`が束縛されている文字列の所有権が`t`に移る。以後`s`は使えない。
let t = s;
// 以下の行で、文字列の所有権が`t`から`print_string`に移る。以後`t`は使えない。
print_string(t);
// もう一度`t`を使おうとしてもエラー。
// print_string(t); // error[E0382]: use of moved value: `t`
// 同じくsを使おうとしてもエラー。
// print_string(s); // error[E0382]: use of moved value: `s`
}

      • 借用

一度使ってしまうと値がなくなっては不便なので、所有権を自分に残したまま、値を他人に貸す。
借用には参照型を使う
参照には、ミュータブルなものとイミュータブルなものがある

イミュータブルな参照

fn ref_string(s: &String) {
println!("{}", s);
}

fn main() {
let s = "this is a resource".to_string();
// 参照1つめ。
let t = &s;
// 参照2つめ。同時に2つ存在できる。
ref_string(&s);

}

ミュータブルな参照

fn refmut_string(s: &mut String) {
// ここでsに対して変更を加えるなどの操作も可能。
println!("{}", s);
}

fn main() {
let mut s = "this is a resource".to_string();
// ミュータブルな参照1つめ。
let t = &mut s;
// ミュータブルな参照2つめはエラー。
// refmut_string(&s); // error[E0499]: cannot borrow `s` as mutable more than once at a time
}

ミュータブルな参照は、2回以上使えない。
ミュータブルな参照とイミュータブルな参照は共存もできない

      • ライフタイム

参照先が存在しないと貸し出せない

ライフタイムとは、{ }で囲んだブロックや、関数のスコープで安全でない参照を作れなくする仕組み

fn main() {
// 本来は`s`のライフタイムはこの関数の最後まで。
let s = "owned data".to_string();
// `{ }`で囲んだブロックはライフタイムを区切る。
{
// `s`はここでムーブしてしまうのでここでライフタイムが終わる。
// `t`のライフタイムはこのブロックの終わりまで。
let t = s;
}
// ここでは`t`にも`s`にもアクセスできない。

// ライフタイムと参照の関係
{
let s = "owned data".to_string();
// ここで`s`への参照`ref_s`を作る。`ref_s`はこのブロックの最後で死ぬが、`s`のほうが長生きしないといけない。
let ref_s = &s;
// `s`を`t`へムーブして`ref_s`より先にライフタイムを終わらせようとするとエラーになる。
// let t = s; // cannot move out of `s` because it is borrowed
}

続く