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 模式

Download history 23472/week @ 2024-04-27 19835/week @ 2024-05-04 24072/week @ 2024-05-11 27003/week @ 2024-05-18 27076/week @ 2024-05-25 29255/week @ 2024-06-01 20753/week @ 2024-06-08 20558/week @ 2024-06-15 28645/week @ 2024-06-22 19916/week @ 2024-06-29 19216/week @ 2024-07-06 26256/week @ 2024-07-13 28736/week @ 2024-07-20 22200/week @ 2024-07-27 20590/week @ 2024-08-03 11961/week @ 2024-08-10

84,088 每月下载量
10 个 crate 中使用 (7 个直接使用)

MIT 许可证

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.0cascade 已经达到 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 编写

无运行时依赖