Benarkah untuk semua tipe `T`,` U` jika `T` dipaksakan menjadi` U` maka `& T` dipaksakan menjadi` & U`?

Aug 17 2020

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, Ujika Tdipaksa Umaka &Tdipaksa &U?

Itu tidak didokumentasikan dalam referensi (setidaknya secara eksplisit).

Jawaban

5 trentcl Aug 17 2020 at 19:54

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: Unsizedan 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.