使用traits/类型类实现通用数字函数的Rust

5

我有一个函数,用于创建整数链表:

enum List<T> { Cons(T, ~List<T>), End }

fn range(start: int, end: int) -> ~List<int> {
    if start >= end { ~End }
    else { ~Cons(start, range(start+1, end)) }
}

然而,我想要制作一个包括无符号整数、双精度数等任何数值类型的范围。但是,例如下面的代码并不能达到效果:

fn range<T: ord>(start: T, end: T) -> ~List<T> {
    if start >= end { ~End }
    else { ~Cons(start, range(start+1, end)) }
}

这将产生:

> rustc list.rs
list.rs:3:12: 3:15 error: use of undeclared type name `ord`
list.rs:3 fn range<T: ord>(start: T, end: T) -> ~List<T> {
                      ^~~
error: aborting due to previous error

我怎样在Rust中编写一个通用函数,限定只有"数值型"类型能够调用它?而不需要自己专门编写接口?我一度认为标准库中有许多特性(如手册第6.2.1.1节中列出的eqord等),但现在我想知道这些是否真正是 "特性"。我能否在声明通用函数时使用该特性?

2个回答

4
特征通常用大写字母表示。在这种情况下,它是 Ord。看看这是否有帮助。

你还需要一个特质来让你添加数字。除非自从我上次看到它以来已经改变,否则我认为你想要Num特质。你可能还需要调用from_int将你的1字面量转换为正确的类型。 - Eric Holk

4
在当前的主分支中,有一个名为“Num”的特质,它作为所有数字类型的通用特质。最近已经进行了一些工作,将许多常见的数学函数统一为在该特质上工作,而不是在u8、f32等上工作。
请参见https://github.com/mozilla/rust/blob/master/src/libstd/num/num.rs#L26以获取上述Num特质。
希望这可以帮助您!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接