Benarkah untuk semua tipe `T`,` U` jika `T` dipaksakan menjadi` U` maka `& T` dipaksakan menjadi` & U`?
Itu terdokumentasi dengan baik yang [T; n]
dapat memaksa [T]
. Kode berikut juga dibentuk dengan baik :
fn test(){
let _a: &[i32] = &[1, 2, 3];
}
Di sini kita memiliki yang &[T; n]
dipaksa &[T]
.
Benarkah untuk semua tipe T
, U
jika T
dipaksa U
maka &T
dipaksa &U
?
Itu tidak didokumentasikan dalam referensi (setidaknya secara eksplisit).
Jawaban
Tidak, karena menambahkan satu lapisan lagi &
menyebabkannya gagal:
fn oops() {
let a: &[i32; 3] = &[1, 2, 3];
let _b: &&[i32] = &a;
}
error[E0308]: mismatched types
--> src/lib.rs:8:23
|
8 | let _b: &&[i32] = &a;
| ------- ^^ expected slice `[i32]`, found array `[i32; 3]`
| |
| expected due to this
|
= note: expected reference `&&[i32]`
found reference `&&[i32; 3]`
Lebih lanjut, ini bukan kasus yang [T; n]
memaksa [T]
dalam arti yang sama dengan &[T; n]
memaksa &[T]
. Dokumentasi yang Anda tautkan menjelaskan dua sifat yang terkait dengan paksaan tidak berskala: Unsize
dan CoerceUnsized
. [T; n]
mengimplementasikan Unsize<[T]>
, dan karenanya &[T; n]
mengimplementasikan CoerceUnsized<&[T]>
; pada dasarnya ini adalah hal yang sama, dan kode Anda secara efektif menunjukkan keduanya. Itu tidak akan mungkin untuk menulis fungsi yang memaksa [T; n]
untuk [T]
tanpa menggunakan referensi (atau pointer dari beberapa macam) karena coercions unsizing hanya terjadi di balik beberapa jenis pointer.