複数の借用

では、複数の借用が関数に渡され、そのうち 1 つが返される場合はどうでしょうか?

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn multiple(a: &i32, b: &i32) -> &i32 {
    todo!("Return either `a` or `b`")
}

fn main() {
    let mut a = 5;
    let mut b = 10;

    let r = multiple(&a, &b);

    // どちらがまだ借用されているのでしょうか?
    // どちらの変更も許可されるべきでしょうか?
    a += 7;
    b += 7;

    dbg!(r);
}
  • このコードは現在、ライフタイム注釈が足りないためコンパイルできません。コンパイルできるようにする前に、この機会を使って、どの引数の借用が戻り値によって延長されるべきかを受講者に考えてもらいましょう。

  • multiple には 2 つの借用を渡し、そのうち 1 つが戻ってくることになるため、引数のライフタイムのうち 1 つの借用を延長する必要があります。どちらを延長すべきでしょうか?これを判断するには multiple の本体を見る必要があるでしょうか?

  • 借用チェックを行う際、コンパイラは外に流れ出る借用を推論するために multiple の本体を見ません。代わりに、借用解析のために関数シグネチャだけを見ます。

  • この場合、返される参照によって ab のどちらが借用されるのかを判断するのに十分な情報がありません。受講者にコンパイラエラーを見せて、ライフタイム構文を導入しましょう。

    // Copyright 2025 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    fn multiple<'a>(a: &'a i32, b: &'a i32) -> &'a i32 { ... }