Когда вы применяете &
к выражениям, Rust автоматически создает анонимные переменные, которым принадлежит результат вычисления выражения. Итак, ваш код примерно эквивалентен
fn main() {
let mut example = String::new();
example += if 1 + 1 == 2 {
let temp1 = "string".to_string();
&temp1
} else {
let temp2 = 'c'.to_string();
&temp2
};
println!("{}", example);
}
Как теперь можно ясно увидеть, область действия (и время жизни) temp1
ограничено ветвью true
выражения if
, а область действия temp2
ограничена false
-ветвление if
-выражения. Ни область действия / время жизни не выходит за пределы выражения if
, поэтому String
внутри обеих ветвей if
нельзя добавить к example
.
В отличие от этого, ваш первый пример примерно эквивалентен
fn main() {
let mut example = String::new();
if 1 + 1 == 2 {
let temp1 = "string".to_string();
example += &temp1;
} else {
let temp2 = 'c'.to_string();
example += &temp2;
};
println!("{}", example);
}
и в обоих случаях temp1
и temp2
живут достаточно долго, так что содержимое String
s можно скопировать и добавить к example
до того, как temp1
и temp2
будут отброшены.