Generics Rust:定义比较长度的泛型函数的特征

Generics Rust:定义比较长度的泛型函数的特征,generics,rust,Generics,Rust,所以我想写一个这样的函数: fn is_longer_than<T>(thing: T, threshold: int) -> bool { thing.len() > threshold } trait HasLength { fn len(&self) -> int } fn is_longer_than<T>(thing: HasLength, threshold: int) -> bool { thin

所以我想写一个这样的函数:

fn is_longer_than<T>(thing: T, threshold: int) -> bool {
    thing.len() > threshold 
}
trait HasLength {
    fn len(&self) -> int
}

fn is_longer_than<T>(thing: HasLength, threshold: int) -> bool {
    thing.len() > threshold 
}
但这不起作用。我错过了什么?我猜有一个预定义的特征涵盖了这个案例?即使如此,为了学习,是否有一种方法来定义它呢?您确实需要将T约束为trait HasLength,这是通过如下语法完成的

这声明了一个接受trait对象的函数,该对象将包括对trait数据的引用和对trait动态调度表的引用。为了创建trait对象,您仍然需要定义适当的impl

两种形式之间的区别在于,第一种形式将针对每种类型进行专门化,也就是说,将针对与函数一起使用的每种类型编译不同版本的函数。第二种形式更像Java语言中的OO代码——只编译函数的一个版本,但是这个版本必须使用动态调度表来调用len

以下是HasLength特性的一个示例impl,它将i32的长度定义为表示它所需的以10为基数的位数:

impl HasLength for i32 {
  fn len(&self) -> int { self.to_string().len() as int }
}

在这种情况下,你能解释一下impl的定义吗?我已经阅读了指南,我看到了impl如何与手动和任意定义的方法一起工作,但我不明白如何将它与标准库已经定义的len连接起来。@一直以来,基于已经存在的方法创建trait可能是另一个问题。我不确定这是否可能。@一直以来,听起来您都希望使用结构类型,也就是duck类型-一种引用定义方法len的所有类型的方法。这在生锈的情况下是不可能的。但是,请参见我的新编辑,并提供一个示例impl。@始终:您可以手动实现trait来调用固有方法:@Shepmaster:这是可能的,这要感谢统一的函数调用语法UFCS:
fn is_longer_than2(thing: &HasLength, threshold: int) -> bool {
    thing.len() > threshold 
}
impl HasLength for i32 {
  fn len(&self) -> int { self.to_string().len() as int }
}