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

Несколько заимствований

Но что, если в функцию передаются несколько заимствований, а возвращается одно из них?

// 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);
}
This slide should take about 5 minutes.
  • Этот код сейчас не компилируется, потому что в нём нет аннотаций времён жизни. Прежде чем заставить его компилироваться, используйте эту возможность, чтобы студенты подумали о том, какое из заимствований аргументов должно быть продлено возвращаемым значением.

  • Мы передаём два заимствования в multiple, и одно из них вернётся обратно, значит, нужно продлить заимствование одного из времён жизни аргументов. Какое из них продлить? Нужно ли видеть тело multiple, чтобы это понять?

  • При проверке заимствований компилятор не смотрит на тело multiple, чтобы рассуждать о заимствованиях, которые выходят наружу; вместо этого для анализа заимствований он смотрит только на сигнатуру функции.

  • В этом случае недостаточно информации, чтобы определить, будет ли возвращённая ссылка заимствовать a или b. Покажите студентам ошибки компилятора и введите синтаксис времён жизни:

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