เป็นความจริงหรือไม่ที่สำหรับ "T" ทุกประเภท, "U" ถ้า "T" ถูกบังคับให้เป็น "U" แล้ว "& T" จะถูกบังคับให้เป็น "& U"?

Aug 17 2020

มีการบันทึกไว้อย่างดีที่[T; n]สามารถบีบบังคับ[T]ได้ รหัสต่อไปนี้ยังมีรูปแบบที่ดี :

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

ที่นี่เรามีที่จะบังคับให้&[T; n]&[T]

มันเป็นความจริงที่ทุกประเภทT, Uถ้าTถูกบังคับให้Uแล้ว&Tถูกบังคับให้&U?

ไม่มีเอกสารในการอ้างอิง (อย่างน้อยก็ชัดเจน)

คำตอบ

5 trentcl Aug 17 2020 at 19:54

ไม่ได้เนื่องจากการเพิ่มเลเยอร์อีกหนึ่งชั้น&ทำให้ล้มเหลว:

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]