gpt4 book ai didi

generics - Rust:为比较长度的通用函数定义特征

转载 作者:行者123 更新时间:2023-11-29 08:05:38 25 4
gpt4 key购买 nike

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

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

一般来说,我对 rust 和静态类型/泛型还很陌生,但据我了解,你需要用一个特征来约束 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接受任何类型 T具有 HasLength 的实现.请注意,您必须为可能要传递给 impl 的每种类型定义一个实现(使用 is_longer_than ) .

或者,该函数可以定义为:

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

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

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

这是一个例子 impl对于 HasLength 特性,它定义了 i32 的长度作为表示它所需的 base-10 数字的数量:

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

关于generics - Rust:为比较长度的通用函数定义特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27477712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com