¿Qué hace 'let x = x' en Rust?

117

Vi este código en la naturaleza :

fields.sort_by_key(|&(_, ref field)| field.tags().into_iter().min().unwrap());
let fields = fields;

¿Qué hace la let fields = fields;línea? ¿Por qué está ahí?

Timthelion
fuente

Respuestas:

144

Se vuelve fieldsinmutable de nuevo.

fieldsse definió previamente como mutable ( let mut fields = …;), para usarse con lo sort_by_keyque ordena en el lugar y requiere que el objetivo sea mutable. El autor ha optado aquí por evitar explícitamente una mayor mutabilidad.

La "degradación" de un enlace mutable a inmutable es bastante común en Rust.

Otra forma común de hacer esto es usar una expresión de bloque:

let fields = {
    let mut fields =;
    fields.sort_by_key();
    fields
};
mcarton
fuente
44
O "actualizar", según su perspectiva.
Synesso
8
En mi opinión, su otra forma de escribir es el camino a seguir: la variable mutable tiene un alcance el tiempo que necesitamos para usarla, y luego se mueve. Es mejor semánticamente.
Boiethios
@DarthBoiethios ¿Alguno de los otros cambia algo en el código compilado? ¿Como agregar una instrucción adicional inútil? ¿O permitir optimizaciones más agresivas por parte del compilador basadas en supuestos de inmutabilidad?
iago-lito 'considerando irse
1
@ iago-lito Honestamente, no estoy seguro, pero mi suposición sin educación es que no cambia nada.
Boiethios
1
@ iago-lito ¡Ahora mismo lo hace! Sin embargo, esto se considera un error y es probable que se solucione en algún momento.
mcarton
19

La declaración la let var = var;hace varinmutable y ligada a su valor actual. fieldsfue declarado como mutantes.

Govind Parmar
fuente