Qual é a diferença semântica entre definir e inicializar uma instância de uma estrutura e uma referência a uma estrutura? Em outras palavras, qual é a diferença entre esses dois programas em Rust?
struct SomeStruct {
some_field: String,
}
fn main() {
let s: SomeStruct = SomeStruct { some_field: "string".to_string() };
println!("{} ", s.some_field);
}
struct SomeStruct {
some_field: String,
}
fn main() {
let s: &SomeStruct = &SomeStruct { some_field: "string".to_string() };
println!("{} ", s.some_field);
}
no próximo código,
s
é do tipoSomeStruct
, ele possui a struct, ele pode movê-la.enquanto no próximo código,
s
é do tipo&SomeStruct
, uma referência imutável a uma struct, a struct está na pilha, ela só não tem um nome e você não pode modificá-la ou movê-la,s
não possui a struct.A ferrugem tem desreferência automática , então
s.some_field
está(*s).some_field
em qualquer coisa "como referência" , e é por isso que essa linha funciona paraSomeStruct
e&SomeStruct
até mesmoBox<SomeStruct>
a principal diferença é que você pode mover
SomeStruct
qualquer um de seus membros, pois você o possui, você não pode fazer isso com uma referência.você pode modificar um objeto com uma referência mutável, mas não pode movê-lo ou seus membros, e não pode converter uma referência imutável em uma mutável.
No primeiro caso,
SomeStruct { ... }
é um valor do tipoSomeStruct
, que está vinculado as
.No segundo caso,
&SomeStruct { ... }
constrói um valor temporário (um valor do tipoSomeStruct
) em um local de memória sem nome e recebe uma referência a esse valor temporário. Como a promoção estática deSomeStruct
não é possível, a referência tem um tempo de vida limitado . Por exemplo, não é possível retornars
da função, pois o valor por trás da referência é limitado em escopo à função atual, tornando a referência inválida quando a função retorna.