Tüm "T", "U" türleri için "T" "U" 'ya zorlanırsa, o zaman "& T" "& U" ya zorlanır mı?

Aug 17 2020

O oluyor iyi belgelenmiş olduğu [T; n]için kutu zorlamak [T]. Aşağıdaki kod da iyi biçimlendirilmiştir :

fn test(){
    let _a: &[i32] = &[1, 2, 3];
}

Burada buna &[T; n]zorlandık &[T].

Her tür için T, Ueğer buna Tzorlanırsa, Uo &Tzaman buna zorlandığı doğru &Umu?

Referansta belgelenmemiştir (en azından açıkça).

Yanıtlar

5 trentcl Aug 17 2020 at 19:54

Hayır, çünkü bir katman daha eklemek &başarısız olmasına neden olur:

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]`

Ayrıca, bu durum böyle değil [T; n] için zorlar [T] aynı anlamda olduğunu &[T; n] coerces için &[T] . Bağladığınız belgeler, boyutlandırılmamış baskılarla ilgili iki özelliği açıklar: Unsizeve CoerceUnsized. [T; n]uygular Unsize<[T]>ve dolayısıyla &[T; n] uygular CoerceUnsized<&[T]>; bu aslında aynı şeydir ve kodunuz her ikisini de etkili bir şekilde gösterir. Coerces bir fonksiyon yazmak mümkün olmazdı [T; n]için [T] olmadan referansları kullanarak (ya da bir tür işaretçiler) unsizing zorlaması sadece pointer çeşit arkasında yer alması nedeniyle.