Несколько заимствований
Но что, если в функцию передаются несколько заимствований, а возвращается одно из них?
// 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, и одно из них вернётся обратно, значит, нужно продлить заимствование одного из времён жизни аргументов. Какое из них продлить? Нужно ли видеть тело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 { ... }