7 个版本 (2 个稳定版)
使用旧的 Rust 2015
1.0.1 | 2022年10月2日 |
---|---|
1.0.0 | 2020年9月21日 |
0.1.4 | 2019年12月1日 |
0.1.3 | 2019年3月23日 |
0.1.2 | 2018年8月14日 |
#87 in Rust 模式
84,088 每月下载量
在 10 个 crate 中使用 (7 个直接使用)
10KB
82 行
cascade
:Rust 中的级联表达式!
cascade
是一个 Rust 宏库,使得使用类似于 Dart 的级联表达式变得简单且易于使用。
#[macro_use]
extern crate cascade;
fn main() {
let cascaded_list = cascade! {
Vec::new();
..push("Cascades");
..push("reduce");
..push("boilerplate");
};
println!("{:?}", cascaded_list); // Will print '["Cascades", "reduce", "boilerplate"]'
}
这只是一个 cascade
可以让你做到的小例子:这个存储库中的 basic_cascades
示例涵盖了 cascade!
宏的其它酷炫功能。
为什么需要这个库呢?
级联减少了冗余,因为它消除了连续调用多个方法时需要使用“临时”变量的需求,并且它还有助于使结构体成员赋值看起来更方便。例如
#[macro_use]
extern crate cascade;
#[derive(Clone, Debug)]
struct Person {
pub name: String,
pub age: u32,
pub height: u32,
pub friend_names: Vec<String>
}
fn main() {
// Without cascades
let person = Person {
name: "John Smith",
age: 17,
height: 68, // 5' 8"
friend_names: {
let mut tmp_names = Vec::new();
tmp_names.push("James Smith".to_string());
tmp_names.push("Bob Jones".to_string());
tmp_names.push("Billy Jones".to_string());
tmp_names
}
};
// With cascades
let person = Person {
name: "John Smith",
age: 17,
height: 68,
friend_names: cascade! {
Vec::new();
..push("James Smith".to_string());
..push("Bob Jones".to_string());
..push("Billy Jones".to_string());
}
};
// Cascades also let you do cool stuff like this
let person_one_year_later = cascade! {
person;
..age += 1;
..height += 2;
};
}
此外,级联使设计流畅接口变得更容易。不再需要在每个函数中都返回 self
!
变更日志
1.0.0: cascade
已经达到 1.0!以下是作为此版本的一部分添加的一些新功能和语法更改
- 绑定变量的语法已更改为使用
let
语法。这使得它与 Rust 语法更一致,并允许你指定级联表达式的类型。
cascade! {
// If you don't need to bind the statement to an identifier, you can use _
let _: Vec<u32> = vec![1,2,3].into_iter().map(|x| x + 1).collect();
..push(1);
}
- 语句前面不再需要
|
。你只需直接放置语句即可,无需前缀。 - 你可以在级联中返回表达式,就像正常的 Rust 块一样。默认情况下,级联将返回级联变量的值。但如果你想返回一个自定义表达式,你可以在级联块的末尾放置它,无需分号。
let has_more_than_three_elements = cascade! {
let v = vec![1,2,3];
..push(4);
v.len() > 3
};
println!("{}", cascade! {
vec![1,2,3];
..push(4);
..into_iter().fold(0, |acc, x| acc + x)
});
- 最后,你可以在级联块内部有嵌套块。例如
cascade! {
vec![1,2,3];
{
let a = 1;
..push(a);
};
}
希望你喜欢 1.0
版的 cascade!请记住在 问题跟踪器 上留下任何投诉或建议。
0.1.3:现在 ? 操作符与级联一起工作,例如这种情况
fn file_read() -> Result<SomeFileClass, ErrorMsg> {
cascade! {
SomeFileClass::create_file_reader("test.txt");
..load()?;
..check_validity()?;
}
}
0.1.2:现在你可以像这样链接方法
fn chain_example() {
cascade! {
FnChainTest::new();
..chain().chain().chain();
}
}
致谢
由 Jane Lewis 编写