6 个版本
0.3.0 | 2020 年 10 月 13 日 |
---|---|
0.2.2 | 2020 年 10 月 11 日 |
0.1.1 | 2020 年 10 月 10 日 |
#1122 在 Rust 模式
10KB
shoogah
一个包含各种 Rust 语法糖的包。其中许多项目受到了其他语言,尤其是 Groovy 的启发。一些操作需要扩展 true 和 false 的概念。在这些情况下,我们使用 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
特质中关于true
或false
的规则。
底层仍然是Rust
所有这些宏都展开为普通的Rust代码,因此通常的语法和类型要求将适用于您使用的变量名、字面量和表达式。
依赖项
~3–4.5MB
~88K SLoC