Проблема не в ссылке &i
, а в создании чего-то нового в качестве временной переменной, которая имеет i.to_string()
(тип String), а затем используется для создания str (примитивного типа), ссылающегося на тип String, который позже уничтожается, потому что это временно. Это означает, что вы называете что-то несуществующее. и String
и str
разные, вы можете увидеть объяснение здесь .
Самый простой способ исправить это - использовать вместо String
:
fn fizzbuzz(last_num: u32) {
for i in 1..last_num+1 {
let result: String = if i % 15 == 0 {
String::from("FizzBuzz")
} else if i % 3 == 0 {
String::from("Fizz")
} else if i % 5 == 0 {
String::from("Buzz")
} else {
i.to_string()
};
println!("{}", result);
}
}
, но если вы хотите продолжать использовать тип str
, вы можете сделать это, как показано ниже:
fn fizzbuzz(last_num: u32) {
for i in 1..last_num+1 {
let wont_be_destroyed: String = i.to_string();
let mut result = &wont_be_destroyed[..];
if i % 15 == 0 {
result = &"FizzBuzz"
} else if i % 3 == 0 {
result = &"Fizz"
} else if i % 5 == 0 {
result = &"Buzz"
}
println!("{}", result);
}
}