質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

2回答

1806閲覧

Rustの借用変数を関数に渡したときの動作

Romira

総合スコア47

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2020/05/12 05:27

質問内容

下記コードの動作においてなぜコンパイルが通るのかがわかりません。
自分が考えている動作の流れとしましては、
0. 10が変数xに束縛される。
0. xの可変借用がyに束縛される。
0. yの所有権がadd関数の引数xに移動する。
0. 二回目のadd関数でエラーが起きる。

と予想していました。
どのような動作がここで行われているかご教授いただきたいと思いまして質問させていただきます。
よろしくおねがいします。

該当のソースコード

Rust

1fn add(x: &mut i32) { 2 *x += 10; 3} 4 5fn main() { 6 let mut x = 10; 7 let y = &mut x; 8 9 add(y); 10 add(y); 11 println!("{}", x); 12} 13

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Rustは参照の使用時に**再借用(reborrow)**を暗黙に挿入することがあります.
質問のコードの場合は可変参照yを関数addに渡すときに再借用が行われており,Rustコンパイラは以下のコードが記述されたかのように借用検査を行っています.

rust

1fn main() { 2 let mut x = 10; 3 let y = &mut x; 4 5 add(&mut *y); // yから再借用したテンポラリの可変参照を渡している 6 add(&mut *y); // 同上 7 println!("{}", x); 8}

つまり,可変参照yをそのまま渡すのではなく,yから一時的な可変参照を新たに生成してそれを渡しています.これによって,あたかも可変参照を再利用しているかのようにプログラムを記述することができます(&mut selfを受け取るメソッドを呼び出すたびに(&mut *self).f()と記述するのは大変です!).

残念ながら現状再借用に関する公式のドキュメントは無いようですが,それについてのIssueでは再借用についての説明がいくつかリンクされています.

投稿2020/05/12 06:13

pandaman64

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Romira

2020/05/12 06:33

回答ありがとうございます。 そのようなことが行われていたのですね
guest

0

add関数にyの所有権は移動していません。
add関数は可変参照で受け取っています。

投稿2020/05/12 05:58

hasami

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問