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?
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
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: Unsizevà CoerceUnsized. [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ỏ.