Tôi đang cố gắng, không thành công, để chơi xung quanh với lát.Loại trả về của hoạt động lập chỉ mục trên một lát là gì?
Tôi đã làm giảm số đầu tiên của tôi để:
fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T {
let item = slice[index];
item
}
Đó là mong đợi của tôi rằng kiểu trả về của slice[index]
là một tài liệu tham khảo, do documentation:
pub trait Index<Index> {
type Output;
fn index(&'a self, index: &Index) -> &'a <Self as Index<Index>>::Output;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
Tuy nhiên, trình biên dịch mang lại cho tôi một lỗi:
error: mismatched types: expected
&'a T
, foundT
(expected &-ptr, found type parameter)item ^~~~
Tôi giải thích là mea ning rằng loại item
không khớp với kiểu trả về của hàm (tôi đã giới thiệu item
chỉ dành cho mục đích gỡ lỗi, để phân tách đánh giá biểu thức từ trả về).
Và rõ ràng, nếu tôi chuyển loại trả về thành T
là loại item
tôi nhận được một thông báo lỗi khác về việc chuyển từ khoản vay như mong đợi.
Sau khi mày mò một chút, cuối cùng tôi có hai công việc ở quanh:
fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T {
&slice[index]
^
}
fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T {
let ref item = slice[index];
^~~
item
}
buộc kiểu là một tài liệu tham khảo hiện các trick.
Nhưng tại sao những shenanigans đó lại cần thiết ngay từ đầu? Tôi có làm gì sai không?
Ah! Tôi hiểu rồi, vì vậy tôi bị bắt bởi đường của '[]'!Tôi đã không nghĩ đến việc gọi 'index' trực tiếp vì tôi không mong đợi một sự khác biệt, mặc dù tôi đã nhận thấy sự khác biệt gọi' [] 'với' T' sẽ desugar gọi 'index' bằng' & T'. Cảm ơn bạn đã minh họa, nó thực sự giúp hình dung mọi thứ. –