Заимствование обоих
В этом случае у нас есть функция, которая может вернуть либо 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вернёт либоa, либоbв зависимости от значенияc, поэтому во время компиляции мы не можем знать, какое из них будет возвращено. -
Чтобы выразить это компилятору, мы используем одно и то же время жизни для
aиb, а также для возвращаемого типа. Это значит, что возвращённая ссылка заимствует Иa, Иb! -
Раскомментируйте обе закомментированные строки и покажите, что
rзаимствует иa, иb, даже если во время выполнения она будет указывать только на одну из них. -
Измените первый аргумент
pick, чтобы показать, что результат одинаков независимо от того, возвращается лиaилиb.