Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Заимствование обоих

В этом случае у нас есть функция, которая может вернуть либо 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);
}
This slide should take about 5 minutes.
  • Функция pick вернёт либо a, либо b в зависимости от значения c, поэтому во время компиляции мы не можем знать, какое из них будет возвращено.

  • Чтобы выразить это компилятору, мы используем одно и то же время жизни для a и b, а также для возвращаемого типа. Это значит, что возвращённая ссылка заимствует И a, И b!

  • Раскомментируйте обе закомментированные строки и покажите, что r заимствует и a, и b, даже если во время выполнения она будет указывать только на одну из них.

  • Измените первый аргумент pick, чтобы показать, что результат одинаков независимо от того, возвращается ли a или b.