3 个不稳定版本
使用旧的 Rust 2015
0.5.0 | 2015 年 9 月 9 日 |
---|---|
0.4.1 | 2015 年 9 月 9 日 |
0.4.0 | 2015 年 9 月 3 日 |
#2646 在 Rust 模式
6,825 每月下载量
用于 31 个crate (2 个直接使用)
8KB
206 行
pipeline.rs
Pipeline 是一个宏集合,用于管道 |> 函数调用,类似于 F# 或 Elixir。由于 Rust 宏系统的限制,它使用 =>
作为管道字符,而不是漂亮的 |>
操作符。
使用方法
将以下内容放入您的 Cargo.toml 中
[dependencies]
pipeline = "0.4.1"
然后您可以使用 extern crate 和 macro_use 导入宏
#[macro_use]
extern crate pipeline;
示例
// pipe_res exits the pipeline early if a function returns an Err()
let result = pipe_res!("https://rust-lang.net.cn" => download => parse => get_links)
fn times(a: u32, b: u32) -> u32{
return a * b;
}
let num = pipe!(
4
=> (times(10))
=> {|i: u32| i * 2}
=> (times(4))
);
// takes a string length, doubles it and converts it back into a string
let length = pipe!(
"abcd"
=> [len]
=> (as u32)
=> times(2)
=> [to_string]
);
宏
pipe!
是“标准”管道宏pipe_res!
与pipe!
类似,但仅接受返回Result
(同一类型)的函数,并在结果为 Err 时提前返回。对于组合多个 IO 转换(如打开文件、读取内容并发出 HTTP 请求)很有用。pipe_opt!
与pipe!
类似,但仅接受返回Option
(同一类型)的函数。只要所有函数返回None
,管道将始终在初始值上继续操作。如果管道中的函数返回Some
,则宏将提前返回该值。这可以用于尝试多个函数以查看哪些函数可以按照指定顺序使用该值。
语法特性
任何 pipe
都以一个表达式作为初始值开始,并需要您指定一个函数来转换该初始值。
let result = pipe!(2 => times2);
如果您添加括号,就像在正常函数调用中一样,传递的参数将在转换后的值之后应用于该函数。这可以让函数更加复杂。
您必须将其放在括号中,因为 Rust 宏系统可能非常受限。如果您发现一种不需要括号的方法,请提交一个 PR。
let result = pipe!(2 => (times(2)));
您还可以传递闭包 \o/! 闭包必须用花括号 ({}
) 括起来
let result = pipe!(
2
=> (times(2))
=> {|i: u32| i * 2}
);
如果您希望将一个函数作为transform值上的方法调用,请将其放在方括号中([]
)。
let result = pipe!(
"abcd"
=> [len]
);