1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2016年10月6日

#22 in #pop

每月下载 22 次

MIT 许可证

4KB

概述

这是一个小小的娱乐项目,可能不适合用于生产环境。目前可变参数仅实现到 4 维度。由于默认类型,Variadic 才成为可能,我认为这种实现是一个 hack

Variadic<T> 是使稳定 Rust 中的可变参数成为可能的特质。 VarArgs1VarArgs2 等实现 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));

无运行时依赖