2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RUSTの参照と借用について

Posted at

まえがき

この記事は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 型は「参照」と呼ばれ、リソースを所有するのではなく、所有権を借用する
  • 何かを借用した束縛はスコープから外れるときにメモリ上のリソースを割当解除しない
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?