2 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2018年9月18日 |
---|---|
0.1.0 | 2018年9月7日 |
#2759 in Rust 模式
13KB
199 行
Tooples
数组函数
在动态语言如javascript中,你可以创建一个包含任意类型元素的数组,然后你可以将任何东西推入或弹出。当然,如果你在列表中引用了错误的项,或者项的类型不是你期望的,你的程序将会出错。然而,javascript 列表附带了一些方便的函数,如 push、pop、shift、unshift 和 join,使它们更容易处理。
在 Rust 中,你可以有元组类型,可以包含任何类型的元素 但是 元组是不可变的,你不能遍历它们,因为元素可以是不同类型的,并且超过 12 个元素的元组缺少一些功能。
此库实现了 push()
、pop()
、shift()
、unshift()
和 join()
函数,用于 12 个元素或更少的元组。除了 join()
之外,元组将被消耗,结果是创建了一个新的元组。
示例
use tooples::*
println!("{}", ("hello", "world").join(" ") );
println!("{}", (1, 1.1).join(" ") );
println!("{}", ("hello", 1.1).join(" ") );
println!("{}", ("hello", 1.1, 1, "world").join(",") );
let x = (1,"hi");
let x = x.push(3.3);
let x = x.push("test");
println!("{}", x.join(" "));
let x = x.pop();
println!("{}", x.join(" "));
let x = x.unshift("before");
println!("{:?}", x);
let x = x.shift().shift();
println!("{:?}", x);
apply_to()
此库还提供了 apply 函数,你可以通过给定的参数元组调用一个函数。它提供了 apply_to()
、apply_to_mut()
和 apply_to_once()
,分别接受 Fn
、FnMut
和 FnOnce
。在每种情况下,提供的元组都是 by-val,它被调用消耗,之后将无法再次使用。
示例
let x = |a,b,c| {
println!("{} / {} / {}", a, b, c);
};
let y = ();
let y = y.push(1);
let y = y.push(&"hello");
let y = y.push(3.2);
y.apply_to(&x);
高级用法
你应该根据它们期望接收的精确元组定义你的函数,然而,如果你想定义一个通用的函数,它可以接收任何元组(最多 12 个元素)并在末尾推入一个特定的元素,你可以这样做。
use std::time::Instant;
fn push_current_time<W>(w:W) -> Push<W,Instant> where W:CanPush<Instant> {
w.push(Instant::now())
}
fn main() {
let x = ();
let x = x.push(3);
let x = push_current_time(x);
let x = x.push(&"hi");
let x = push_current_time(x);
println!("{:?}", x);
}
在这里,你不需要指定输入元组的具体类型,而是指定它是任何“能够接收 Instant 实例”的对象(代码:where W:CanPush<Instant>
)。返回类型被描述为“将 Instant 推送到 W 的结果”(代码:Push<W,Instant>
)。你甚至可以做得更复杂,但函数签名会迅速变得难以管理。
fn replace_last_item<W,X>(w:W, x:X) -> Push<Pop<W>,X> where
W:CanPop, Pop<W>:CanPush<X>
{
let w = w.pop();
w.push(x)
}
在这个例子中,我们接受一个 W 元组,或者更确切地说,我们接受一个“可以从其弹出”的 W(《代码:W:CanPop》)作为长度的结果必须能够将一个 X 推送到它(《代码:Pop<W>:CanPush<X>)的对象。这个函数将替换元组中的最后一个元素,无论它的长度或类型如何。