rust:spec
Rustの言語仕様
所有権
以下のコードはエラーになる
fn print(a: String) { println!("{}", a) } let s = String::new("str"); print(s); print(s); // エラー
最初のprint関数に渡した時点で変数sはStringインスタンスの所有権を失っており、それ以降の行でアクセスするとエラーになる。
参照
参照を使うと所有権を失わずにデータを渡すことができる。
fn print(a: &String) { println!("{}", a) } let s = String::new("str"); print(&s); print(&s); // 今度はOK
コピートレイト
コピートレイトが実装された型は値を渡すときにコピーされるため、所有権を失わない。また、後述のライフタイムの影響も受けない
i32等の基本的な型、chronoライブラリのDateTime型などはコピートレイトを実装している。
自分で構造体にコピートレイトを実装するときは構造体のサイズに気をつけること
不変
参照は基本的にで変更不可である
fn print(a: &String) { a.insert_str(0, "nyan"); // 参照を変更しようとするとエラーになる println!("{}", a) } let s = String::new("wang"); print(&s); print(&s);
参照を変更したいときはmutable参照型として定義し、引数も変更可能な参照型を受け取るようにする
fn print(a: &mut String) { a.insert_str(0, "nyan"); // mutable参照なので変更可能 println!("{}", a) } let s = &mut String::new("wang"); print(s); // wangnyanと出力 print(s); // wangnyannyanと出力
ライフタイム
rust/spec.txt · 最終更新: 2022/07/10 04:00 by nullpon