繁体   English   中英

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

[英]Rust: defining trait for generic function that compares length

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

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

一般而言,我对锈和静态类型化/泛型还很陌生,但是据我了解,您需要使用一种在这种情况下实现len方法的特征来约束T

我试图做这样的事情:

trait HasLength {
    fn len(&self) -> int
}

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

但这是行不通的。 我想念什么? 我猜有一个涵盖此情况的预定义特征? 即使这样,仍然有一种方法可以定义它(为了学习)

您确实需要将T约束为特征HasLength ,这是通过<T: HasLength>这样的语法完成的。

trait HasLength {
    fn len(&self) -> int;
}

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

这声明函数is_longer_than接受具有HasLength实现的任何类型T 请注意,您将必须为可能要传递给is_longer_than每种类型定义一个实现(使用impl )。

另外,该函数可以定义为:

fn is_longer_than2(thing: &HasLength, threshold: int) -> bool {
    thing.len() > threshold 
}

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

两种形式之间的区别在于,第一种形式将专用于每种类型,也就是说,将针对与该函数一起使用的每种类型编译该函数的不同版本。 第二种形式将更像Java语言一样的OO代码-仅会编译该函数的单个版本,但是此版本将必须使用动态调度表来调用len

下面是一个例子impl为HasLength性状,即一个的长度限定i32作为以表示它需要碱-10数字的数目:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM