Não entendo como o seguinte código Rust libera essas variáveis.
struct A(&'static str);
impl A {
fn as_ref(&self) -> &Self { &self }
}
impl Drop for A {
fn drop(&mut self) {
print!("{}", self.0);
}
}
fn main() {
let a = A("X");
let a = A("Y").as_ref();
print!("Z");
}
Por que isso imprime YZX no final?
Como a expressão
A("Y")
não está vinculada a uma variável, ela segue as regras para escopos temporários . Neste exemplo, o menor escopo que contém esta expressão é a instruçãolet a = A("Y").as_ref();
. Portanto,A("Y")
é descartado no ponto e vírgula.Isso significa que o segundo
a
fica imediatamente inutilizável. Isso é normal, pois ele não é usado nem tem comportamento de descarte.