我正在为我的trait函数定义一个返回迭代器的默认实现。
我定义了一个trait(Labels
),它有两个函数(labels_vec
和labels_iterator
)。我还有一个实现该trait的struct(NumberThing
)。看下面的小例子:
use std::{iter::Map, ops::RangeInclusive};
trait Labels {
type Iterator: Iterator<Item = String>;
// This trait function has a default implementation.
fn labels_vec(&self) -> Vec<String> {
vec!["default".to_string()]
}
// Can this trait function also have a default implementation? How?
fn labels_iterator(&self) -> Self::Iterator;
}
struct NumberThing {
max: u8,
}
impl Labels for NumberThing {
type Iterator = Map<RangeInclusive<u8>, fn(u8) -> String>;
fn labels_iterator(&self) -> Self::Iterator {
(0..=self.max).map(|number| number.to_string())
}
}
pub fn main() {
let number_thing = NumberThing { max: 3 };
let labels_from_iterator: Vec<String> = number_thing.labels_iterator().collect();
println!("labels from iterator: {labels_from_iterator:?}");
println!("labels from vec: {:?}", number_thing.labels_vec());
}
字符串
如何为labels_iterator
添加默认实现?
3条答案
按热度按时间rqmkfv5c1#
你不能这么做
好吧,如果你真的想,那么你可以,在夜间,通过转发逻辑到另一种类型...但别这样求你了。
字符串
v8wbuo2f2#
只有当关联类型提供了某种方式来构造自己时,例如通过实现
Default
trait:字符串
但这似乎没什么用。如果你想用默认impls中的类型做更复杂的事情,关联类型可能不是正确的解决方案。
zi8p0yeb3#
Chayim Friedman's answer让我走上了正确的道路。为了将来的参考,我将把我最后得到的代码放在下面。
即使代码片段使用rust nightly通道,也很容易修改它以使其在稳定通道中工作。
字符串