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));