เป็นความจริงหรือไม่ที่สำหรับ "T" ทุกประเภท, "U" ถ้า "T" ถูกบังคับให้เป็น "U" แล้ว "& T" จะถูกบังคับให้เป็น "& U"?
มีการบันทึกไว้อย่างดีที่[T; n]
สามารถบีบบังคับ[T]
ได้ รหัสต่อไปนี้ยังมีรูปแบบที่ดี :
fn test(){
let _a: &[i32] = &[1, 2, 3];
}
ที่นี่เรามีที่จะบังคับให้&[T; n]
&[T]
มันเป็นความจริงที่ทุกประเภทT
, U
ถ้าT
ถูกบังคับให้U
แล้ว&T
ถูกบังคับให้&U
?
ไม่มีเอกสารในการอ้างอิง (อย่างน้อยก็ชัดเจน)
คำตอบ
ไม่ได้เนื่องจากการเพิ่มเลเยอร์อีกหนึ่งชั้น&
ทำให้ล้มเหลว:
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]`
ต่อไปก็ไม่ได้เป็นกรณีที่[T; n]
coerces ไป [T]
ในความรู้สึกเดียวกันกับที่&[T; n]
coerces &[T]
ไป เอกสารที่เชื่อมโยงอธิบายทั้งสองลักษณะที่เกี่ยวข้องกับการ coercions unsized: และUnsize
การดำเนินการและดังนั้นจึงดำเนินการ; โดยพื้นฐานแล้วนี่คือสิ่งเดียวกันและรหัสของคุณแสดงให้เห็นทั้งสองอย่างได้อย่างมีประสิทธิภาพ มันจะไม่เป็นไปได้ที่จะเขียนฟังก์ชันที่ coerces ไปได้โดยไม่ต้องใช้การอ้างอิง (หรือตัวชี้ของการจัดเรียงบางคน) เพราะ coercions unsizing ใช้เวลาเพียงสถานที่ที่อยู่เบื้องหลังชนิดของตัวชี้บางCoerceUnsized
[T; n]
Unsize<[T]>
&[T; n]
CoerceUnsized<&[T]>
[T; n]
[T]