¿Por qué una referencia anidada a una matriz no obliga a un segmento?
Yo leo¿Cuáles son las reglas exactas de auto-referencia de Rust? de principio a fin, pero todavía tengo una pregunta sobre la coerción de la matriz a la división.
Pensemos en el siguiente código:
let arr: &[i32; 5] = &&&[1, 2, 3, 4, 5];
// let arr: &[i32] = &&&[1, 2, 3, 4, 5]; // Error; expected slice, found reference
Yo esperaría que&&&[1, 2, 3, 4, 5]
tiene el tipo&&&[i32; 5]
y desreferencias a&&[i32; 5]
=>&[i32; 5]
=>&[i32; 5]
=>&[i32]
, pero el resultado es diferente de lo que esperaba.
Traté de ejecutar el siguiente código:
let arr: &&&[i32; 5] = &&&[1, 2, 3, 4, 5];
let n = arr.first().unwrap(); // 1
Ese es el código correcto. El tipo dearr
está obligado a&&&[i32; 5]
=>&&[i32; 5]
=>&[i32; 5]
=>&[i32]
y coincide con el primer argumento defirst
en rodaja&self
.
¿Cuál es la condición que las matrices obligan a cortar? No entiendo la diferencia entre el código anterior y el último.
También reviséla documentación en el código fuente, y supongo que la pregunta anterior tiene algo que ver con la oración citada a continuación;
Sin embargo, a veces hacemos otros ajustes y coacciones a lo largo del camino, en particular el cambio de tamaño (por ejemplo, la conversión de [T; n] a [T]).