如何定义关联类型的特征边界?
How do I define trait bounds on an associated type?
我想编写一个接受具有 ToString
特征的 Iterator
类型的函数。
我的想法:
fn parse<T: Iterator /* ?T::Item : ToString? */>(mut args: T) -> Result<String, String> {
match args.next() {
Some(x) => x.to_string(),
None => String::from("Missing parameter"),
}
}
是的,您可以使用 where
子句来做到这一点:
fn parse<T: Iterator>(mut args: T) -> Result<String, String>
where
<T as Iterator>::Item: ToString,
{
// ....
}
或者,由于此处 Item
的含义很明确,因此界限可以是:
where T::Item: ToString
您可以使用 Item =
syntax:
fn parse<I: ToString, T: Iterator<Item = I>>(mut args: T) -> Result<String, String>
这允许您使用 impl
语法进一步简化它:
fn parse<T: Iterator<Item = impl ToString>>(mut args: T) -> Result<String, String>
最后:
fn parse(mut args: impl Iterator<Item = impl ToString>) -> Result<String, String>
我认为这是一个更具可读性的替代方案。
我想编写一个接受具有 ToString
特征的 Iterator
类型的函数。
我的想法:
fn parse<T: Iterator /* ?T::Item : ToString? */>(mut args: T) -> Result<String, String> {
match args.next() {
Some(x) => x.to_string(),
None => String::from("Missing parameter"),
}
}
是的,您可以使用 where
子句来做到这一点:
fn parse<T: Iterator>(mut args: T) -> Result<String, String>
where
<T as Iterator>::Item: ToString,
{
// ....
}
或者,由于此处 Item
的含义很明确,因此界限可以是:
where T::Item: ToString
您可以使用 Item =
syntax:
fn parse<I: ToString, T: Iterator<Item = I>>(mut args: T) -> Result<String, String>
这允许您使用 impl
语法进一步简化它:
fn parse<T: Iterator<Item = impl ToString>>(mut args: T) -> Result<String, String>
最后:
fn parse(mut args: impl Iterator<Item = impl ToString>) -> Result<String, String>
我认为这是一个更具可读性的替代方案。