6 个版本

0.3.0 2020 年 10 月 13 日
0.2.2 2020 年 10 月 11 日
0.1.1 2020 年 10 月 10 日

#1122Rust 模式

MIT/Apache

10KB

shoogah

一个包含各种 Rust 语法糖的包。其中许多项目受到了其他语言,尤其是 Groovy 的启发。一些操作需要扩展 truefalse 的概念。在这些情况下,我们使用 AsBool 特性。任何实现 AsBool 的类型都将与 shoogah 一起工作。

使用 hml! 宏轻松创建 HashMap 字面量

通过简单的字面量定义 std::collections::HashMap

    #[macro_use] extern crate shoogah;
    let my_map = hml! [
        "a": 1,
        "b": 2,
        "c": 1 + 2,
    ];

在这个例子中,my_map 的类型为 std::collections::HashMap<&str, i32>. 要创建一个空映射

    #[macro_use] extern crate shoogah;
    let mut my_map = hml![:];
    my_map.insert("a", 1);

请注意,在像这样的空映射声明中,只有在插入条目后,映射才会推断出其类型。因此,如果在插入任何条目前尝试使用空映射,您将收到编译器错误。如果您的用例需要空映射,请在左侧添加类型注解,如下所示

    #[macro_use] extern crate shoogah;
    use std::collections::HashMap;
    let mut my_map: HashMap<&str, u8> = hml![:];

映射键可以是标识符(变量名)或字面量,如 1"Hello"。映射值可以是任何类型的表达式。

使用 cxp! 宏创建紧凑的条件表达式

    #[macro_use] extern crate shoogah;
    let x = "";
    let username = cxp!{ (x) ? (x) : ("Bytor") }; // username assigned "Bytor"

由于表达式可能很复杂,因此需要括号。

Elvis 说:“不要重复自己”;elv! 宏

    #[macro_use] extern crate shoogah;
    let x = "Cygnus";
    let username = elv!{ (x) ?: ("Bytor") }; // username remains "Cygnus"

Elvis 说:“不要重复自己...再次”;ela! 宏

如果分配给变量的是正在测试的条件,那么 Elvis 分配宏(ela!)适合您。

    #[macro_use] extern crate shoogah;
    let mut username = "";
    ela!{ username ?= "Bytor" }; // username is now "Bytor"

使用 suf! 宏进行简单的递增和递减

    #[macro_use] extern crate shoogah;
    let mut x = 1;
    assert_eq!(2, suf!{ x++ });
    assert_eq!(1, suf!{ x-- });

使用 spr! 宏从 Iterator 收集常见的字段值

    #[macro_use] extern crate shoogah;
    #[derive(Clone)]
    struct Address<'a> {
        country: &'a str,
    }

    #[derive(Clone)]
    struct Customer<'c> {
        name: &'c str,
        address: Address<'c>,
    }

   let customers = vec![
       Customer{ name: "Carlos", address: Address{ country: "Spain" }},
       Customer{ name: "Johnathan", address: Address{ country: "United Kingdom" }},
       Customer{ name: "Enzo", address: Address{ country: "Italy" }},
   ];
   let countries: Vec<_> = spr! { (customers)*.address*.country };
   assert_eq!(vec!["Spain", "United Kingdom", "Italy"], countries);

请注意,此操作需要实现 Iterator 的集合和实现 Clone 的项,因为它们被移出了原始项。此外,请注意第一个表达式需要括号,允许进行链接和将字面量作为初始集合。

使用 sin! 进行字符串插值

    #[macro_use] extern crate shoogah;
    // Normal string literal, no inner quotes (") allowed.
    let mut msg = sin!{ "1 + 1 = ${ 1 + 1 }" };
    assert_eq!("1 + 1 = 2", msg);
    // Raw string literal, inner quotes (") are allowed.
    msg = sin!{ r#"Hello, ${ "World!" }"# };
    assert_eq!("Hello, World!", msg);

${}内的表达式几乎可以是任何东西,但不能包含结束括号}

使用boo!进行布尔强制类型转换

    #[macro_use] extern crate shoogah;
    let x = 1; let y = 0;
    assert_eq!(true, boo!{ x });
    assert_eq!(false, boo!{ y });

这里我们使用了来自AsBool特质中关于truefalse的规则。

底层仍然是Rust

所有这些宏都展开为普通的Rust代码,因此通常的语法和类型要求将适用于您使用的变量名、字面量和表达式。

依赖项

~3–4.5MB
~88K SLoC