Tüm "T", "U" türleri için "T" "U" 'ya zorlanırsa, o zaman "& T" "& U" ya zorlanır mı?
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
, U
eğer buna T
zorlanırsa, U
o &T
zaman buna zorlandığı doğru &U
mu?
Referansta belgelenmemiştir (en azından açıkça).
Yanıtlar
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: Unsize
ve 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.