2016-09-02 22 views
5

Tôi muốn xác định một đặc điểm Container sao cho mỗi người triển khai đặc điểm này cũng cần triển khai IntoIterator, với báo trước rằng LUÔN LUÔN chỉ mượn cá thể. Nếu tôi hiểu đúng, tôi có thể thực hiện IntoIterator sử dụng một mô hình như thế này:Ràng buộc đặc điểm của phụ huynh để tham chiếu

impl<'a> IntoIterator for &'a ContainerImpl 

Tuy nhiên, làm thế nào tôi có thể xác định rằng điều này cần phải được thực hiện nếu một loại thực Container, ví dụ:

trait Container: &IntoIter ??? 

Trả lời

6

Bạn có thể thêm một điều khoản where đến đặc điểm, quá (playground):

trait IterBorrow where for<'a> &'a Self: IntoIterator {} 
impl IterBorrow for [i32] {} // legal 
// impl IterBorrow for i32 {} // Illegal 

Tuy nhiên, có vẻ như bạn đang cần để nhắc lại giới hạn này bất cứ khi nào bạn thực sự muốn lặp lại, tức là, chức năng này không biên dịch mà không có mệnh đề where:

fn foo<T: IterBorrow>(x: T) where for<'a> &'a T: IntoIterator { 
    for _ in &x {} 
    for _ in &x {} 
} 
+0

Điều đó có ý nghĩa, nhưng bản mẫu được thêm vào là khá đáng tiếc. Bạn cũng có thể chỉ cho tôi một tài liệu mô tả việc sử dụng cho <> trong mệnh đề where? Tôi không thể tìm thấy nó ở bất cứ đâu .. – MrMobster

+0

@MrMobster Chúng được gọi là giới hạn đặc điểm được xếp hạng cao hơn. Không có nhiều tài liệu, nhưng tôi đã tìm thấy tài liệu này: https://doc.rust-lang.org/nomicon/hrtb.html – delnan

Các vấn đề liên quan