1 个不稳定版本
使用旧的 Rust 2015
| 0.1.0 | 2016年10月6日 |
|---|
#22 in #pop
每月下载 22 次
4KB
概述
这是一个小小的娱乐项目,可能不适合用于生产环境。目前可变参数仅实现到 4 维度。由于默认类型,Variadic 才成为可能,我认为这种实现是一个 hack。
Variadic<T> 是使稳定 Rust 中的可变参数成为可能的特质。 VarArgs1、VarArgs2 等实现 Variadic<T>,这允许用户调用 pop()。
pop 将返回一个包含第一个参数的 Option 和另一个 VarArgs(n-1)。例如
let (Some(value), rest: VarArgs2<i32, i32>) = VarArgs3(1, 2, 3).pop();
示例
一个简单的递归实现的求和示例。
fn sum<Args: Variadic<i32>>(args: Args) -> i32 {
if let (Some(front), rest) = args.pop() {
front + sum(rest)
} else {
0
}
}
println!("sum: {}", sum(VarArgs4(1, 2, 3, 4)));
这里我们在 VarArgsN<i32...> 上调用 pop,它将返回 (Option<i32>, VarArgs(N-1)<i32...>)。递归在 VarArgs0 时停止,它将返回一个 (Option<i32>, VarArgs0<i32>),其中 Option<i32> 总是 None。
fn fact<Args: Variadic<i32>>(args: Args) -> i32 {
if let (Some(front), rest) = args.pop() {
front * fact(rest)
} else {
1
}
}
println!("fact: {}", fact(VarArgs4(1, 2, 3, 4)));
还可以使用特质与 Variadic 结合使用。这里我们将 T 限制为 std::fmt::Debug,然后我们打印出我们通过 pop 移除的每个值,直到我们达到 VarArgs0。
fn debug_print<T, Args: Variadic<T>>(args: Args)
where T: std::fmt::Debug
{
if let (Some(front), rest) = args.pop() {
println!("{:?}", front);
debug_print(rest);
}
}
debug_print(VarArgs3(1, 2, 3));