両方を借用する
このケースでは、a または b のいずれかが返される可能性のある関数があります。この場合、ライフタイム注釈を使って、両方の借用が戻り値に流れ込む可能性があることをコンパイラに伝えます。
// Copyright 2025 Google LLC // SPDX-License-Identifier: Apache-2.0 fn pick<'a>(c: bool, a: &'a i32, b: &'a i32) -> &'a i32 { if c { a } else { b } } fn main() { let mut a = 5; let mut b = 10; let r = pick(true, &a, &b); // どちらがまだ借用されているでしょうか? // どちらかの変更は許可されるべきでしょうか? // a += 7; // b += 7; dbg!(r); }
-
pick関数はcの値に応じてaまたはbのいずれかを返します。つまり、どちらが返されるかはコンパイル時にはわかりません。 -
これをコンパイラに表現するために、
aとbの両方、および戻り値の型に同じライフタイムを使います。これは、返された参照がaとbの両方を借用することを意味します! -
コメントアウトされている 2 行を両方とも有効にして、実行時にはその一方だけを指していても、
rがaとbの両方を借用していることを示してください。 -
pickの最初の引数を変更して、aとbのどちらが返されるかにかかわらず結果が同じであることを示してください。