ユーザ用ツール

サイト用ツール


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