両方を借用する

このケースでは、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 のいずれかを返します。つまり、どちらが返されるかはコンパイル時にはわかりません。

  • これをコンパイラに表現するために、ab の両方、および戻り値の型に同じライフタイムを使います。これは、返された参照が ab の両方を借用することを意味します!

  • コメントアウトされている 2 行を両方とも有効にして、実行時にはその一方だけを指していても、rab の両方を借用していることを示してください。

  • pick の最初の引数を変更して、ab のどちらが返されるかにかかわらず結果が同じであることを示してください。