まえがき
この記事はRUSTチュートリアルをZerobillbank社内メンバー(有志)で勉強がてら、可能な限りわかりやすく内容を書き出す企画の一部です。
本項では、RUSTのキモとされる 所有権 の考え方について記したいと思います。
なお、初学者のため(略)という免責を打ちつつ間違いなどあればコメントで教えていただけますと一同嬉しく思います!
概要
前項では変数に対する所有権について説明しました。
本項では、この所有権を借用するという概念について説明します。
ただ、考え方は所有権と一緒です。違うのは最初に定義し束縛した変数であるか、本項はそれを借り受けて(参照して)いるかです。
借用とは
借用は単純に所有権を持っている状態ではなく、コピーして参照している状態です。
例として前項で出てきたコードを使うとこのようになります。
fn foo(v1: Vec<i32>, v2: Vec<i32>) -> (Vec<i32>, Vec<i32>, i32) {
// v1とv2についての作業を行う
(v1, v2, 42)
}
let v1 = vec![1, 2, 3];
let v2 = vec![1, 2, 3];
let (v1, v2, answer) = foo(v1, v2);
上記は こちら で動作の確認が可能です。
では、これを借用する形式に書き換えてみます。
fn foo(v1: &Vec<i32>, v2: &Vec<i32>) -> i32 {
42
}
let v1 = vec![1, 2, 3];
let v2 = vec![1, 2, 3];
let answer = foo(&v1, &v2);
上記はこちらから動作の確認が可能です。
最後の answer
部分の記述に注目して下さい。
関数foo
に渡す際、 &
をつけることで変数の参照渡しを行っています。もちろん関数foo
側でも、受け取る値は参照県のものであることを方定義しています。
このようにすることで、関数foo
で変数 v1
, v2
を渡した後でも、そのままv1,v2は再利用することが可能です。
まとめ
- Vecを使うかわりに参照(&Vec)を使う
- v1とv2を直接渡す代わりに、 &v1 と &v2 を渡す
- &T 型は「参照」と呼ばれ、リソースを所有するのではなく、所有権を借用する
- 何かを借用した束縛はスコープから外れるときにメモリ上のリソースを割当解除しない