我正在嘗試實作一個由泛型欄位組成的結構,該型別必須實作非消耗的“iter”方法(見下文)。
struct Node<T> {
key: T
}
impl<T> Node<T> where T: ?? {
fn do_stuff(&self) {
for e in self.key.iter() {
/* ... */
}
}
}
fn main() {
let n1 = Node { key: "foo".to_owned() };
n1.do_stuff();
let n2 = Node { key: vec![1, 2, 3] };
n2.do_stuff();
}
我應該將哪個 trait bound 與引數關聯T?
uj5u.com熱心網友回復:
您正在尋找的 trait bound 是&T: IntoIterator. 按照慣例,提供非消費的型別iter()也提供IntoIteratorfor的實作&T。(同樣,iter_mut()與IntoIteratorfor的 impl 成對出現&mut T。)
所以,當你將無法從字面上打電話iter(),你就可以通過標準庫的容器,如能迭代Vec,HashMap等等,不消耗他們:
impl<T> Node<T>
where
for<'a> &'a T: IntoIterator,
{
fn do_stuff(&self) {
for e in &self.key { /* ... */ }
}
}
操場
請注意,上述內容不會key: "foo".to_owned()僅僅因為 Rust 字串不可迭代而被接受。
uj5u.com熱心網友回復:
我應該將哪個 trait bound 與引數關聯
T?
標準庫中沒有這樣的特性,它iter()是一種固有的方法——它不是來自特性實作。當然,您可以創建自己的特征(例如,Iter)來指定iter()。
如果您正在使用泛型型別并需要確保此型別別的值可以轉換為迭代器,您可能需要考慮將型別系結到IntoIterator特征。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363829.html
下一篇:打字稿嵌套泛型
