Có đúng là đối với tất cả các kiểu `T`,` U` nếu `T` bị ép buộc thành` U` thì `& T` bị ép buộc thành` & U` không?

Aug 17 2020

Nó được ghi lại đầy đủ [T; n]có thể ép buộc [T]. Đoạn mã sau cũng được định dạng tốt :

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

Ở đây chúng tôi có điều đó &[T; n]được cưỡng chế &[T].

Có đúng là đối với tất cả các loại hình T, Unếu Tbị cưỡng chế Uthì mới &Tbị cưỡng chế &U?

Nó không được ghi lại trong tài liệu tham khảo (ít nhất là rõ ràng).

Trả lời

5 trentcl Aug 17 2020 at 19:54

Không, vì thêm một lớp nữa &khiến nó bị lỗi:

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

Hơn nữa, nó không phải là trường hợp [T; n] ép buộc [T] theo cùng một nghĩa là &[T; n] ép buộc &[T] . Tài liệu bạn đã liên kết mô tả hai đặc điểm liên quan đến các cưỡng chế chưa được kích thước: UnsizeCoerceUnsized. [T; n]thực hiện Unsize<[T]>, và do đó &[T; n] thực hiện CoerceUnsized<&[T]>; điều này về cơ bản giống nhau và mã của bạn thể hiện hiệu quả cả hai. Sẽ không thể viết một hàm cưỡng [T; n]chế [T] mà không sử dụng tham chiếu (hoặc con trỏ của một số loại) bởi vì cưỡng chế hủy kích thước chỉ diễn ra sau một số loại con trỏ.