Trait Bound
Một syntax sugar khác mà ta có thể sử dụng thay cho &impl Summary
ở trên,
gọi là trait bound, bạn sẽ bắt gặp nhiều trong Rust document:
pub fn notify<T: Summary>(item: &T) { println!("News: {}", item.summarize()); }
Đầu tiên chúng ta định nghĩa trait bound bằng cách định nghĩa
một generic type parameter trước, sau đó là :
trong ngoặc <
và >
.
Ta có thể đọc là: item
có kiểu generic là T
và T
phải được impl Summary
.
notify<T>(
khai báo generic typeT
notify<T: Summary>(
generic type được implementtrait Summary
Cú pháp này có thể dài hơn và không dễ đọc như &impl Summary
, nhưng hãy xem ví dụ dưới đây:
pub fn notify(item1: &impl Summary, item2: &impl Summary) {} // (1) pub fn notify<T: Summary>(item1: &T, item2: &T) {} // (2)
Dùng trait bound giúp ta tái sử dụng lại T
,
mà còn giúp force item1
và item2
có cùng kiểu dữ liệu,
đây là cách duy nhất (cả 2 đều là NewsArticle
hoặc cả 2 đều là Tweet
) mà (1) không thể.