Trong Rust 1,14, các Index
trait được định nghĩa như sau:Tại sao tham số loại `Idx` của đặc điểm` Chỉ số` được phép được unsized?
pub trait Index<Idx> where Idx: ?Sized {
type Output: ?Sized;
fn index(&self, index: Idx) -> &Self::Output;
}
Các ngầm Sized
ràng buộc của các loại Output
là thoải mái với ?Sized
đây. Điều này có ý nghĩa, bởi vì phương pháp index()
trả về một tham chiếu đến Output
. Do đó, các loại chưa được sử dụng có thể được sử dụng, điều này rất hữu ích; ví dụ:
impl<T> Index<Range<usize>> for Vec<T> {
type Output = [T]; // unsized!
fn index(&self, index: Range<usize>) -> &[T] { … } // no problem: &[T] is sized!
}
Ràng buộc tiềm ẩn của thông số loại Idx
cũng thoải mái và có thể được unsized. Nhưng Idx
được sử dụng bởi giá trị làm đối số phương thức và sử dụng các loại chưa được đánh số làm đối số là không thể AFAIK. Tại sao Idx
được phép để được unsized?
Câu trả lời hay như bình thường! – mcarton
* Cũng có nói rằng một ngày nào đó, chúng ta có thể muốn truyền các loại có kích thước động (DST) theo giá trị, mặc dù tôi không hiểu làm thế nào. * => Có sự khác biệt giữa ngôn ngữ và triển khai. Chỉ vì ngôn ngữ xem xét nó là một động thái (đi qua giá trị) không ngụ ý rằng ở mức ABI giá trị không được chuyển bởi con trỏ. Và do đó nó là hoàn toàn hợp lý để có ngôn ngữ vượt qua DST bởi các giá trị với việc thực hiện thực tế là một con trỏ được sử dụng. Trả lại chúng theo giá trị, tuy nhiên, có vẻ phức tạp hơn :) –