[英]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.