Rust

Rustの借用と参照

所有権を渡さずに値を読む方法と、可変参照で安全に変更する方法を学びます。

Rust入門の講座一覧

01

参照で所有権を借りる

関数の引数に&を付けると、所有権を移動せずに値を読み取れます。読み取りが終われば、元の変数をそのまま使えます。

文字列を借用するRUST
fn length(text: &String) -> usize {
    text.len()
}

fn main() {
    let message = String::from("Rust");
    println!("{}文字", length(&message));
    println!("{message}");
}
実行結果OUTPUT
4文字
Rust
02

Stringと&strを使い分ける

Stringは所有する文字列、&strは文字列データを借りて見る参照です。読み取るだけの関数は&strを受け取ると、Stringと文字列リテラルの両方に対応できます。

&strを受け取るRUST
fn first_char(text: &str) -> Option<char> {
    text.chars().next()
}

fn main() {
    println!("{:?}", first_char("Rust"));
    let language = String::from("Rust");
    println!("{:?}", first_char(&language));
}
実行結果OUTPUT
Some('R')
Some('R')
03

&mutで値を変更する

値を変更する参照には&mutを使います。同じ期間に複数の可変参照を作ることはできません。

可変参照RUST
fn add_mark(text: &mut String) {
    text.push('!');
}

fn main() {
    let mut message = String::from("Hello");
    add_mark(&mut message);
    println!("{message}");
}
実行結果OUTPUT
Hello!
同時に借りない読み取り参照がある間に可変参照を作ると、データ競合を防ぐためコンパイルエラーになります。
04

スライスで一部を参照する

スライスは、配列やベクターなどの一部を所有権なしで参照する型です。

ベクターのスライスRUST
fn show_middle(values: &[i32]) {
    println!("{:?}", &values[1..3]);
}

fn main() {
    let values = vec![10, 20, 30, 40];
    show_middle(&values);
}
実行結果OUTPUT
[20, 30]
05

練習

&strを受け取り、空白で区切った最初の単語を返す関数を作ってみましょう。返り値をOption<&str>にすると、空文字列も安全に扱えます。