2 个版本
0.1.1 | 2019 年 7 月 29 日 |
---|---|
0.1.0 | 2019 年 7 月 10 日 |
#2167 in Rust 模式
5KB
70 行
koption_macros
一些在处理 Option
时有用的宏。
or!
:or!(optA => optB => optC)
将选择第一个非None
的值,类似于 SQL 中的COALESCE
。and!
:and!(optA => optB => optC)
当所有值都是Some
时将生成一个元组(A, B, C)
。try_!
: 这是对 try 块的Option
专用版本,与 nightly 版本中的 try 块相比,它在类型推断方面似乎表现更好。
一旦我能想出如何使用 proc_macros,我计划添加至少一个新功能。
示例
直接来自单元测试。
#[test]
fn or_works() {
assert_eq!(Some(1), or!(Some(1) => Some(2) => Some(3)));
assert_eq!(Some(2), or!(None => Some(2) => Some(3)));
assert_eq!(Some(3), or!(None => None => Some(3)));
assert_eq!(None::<()>, or!(None => None => None));
}
#[test]
fn and_works() {
assert_eq!(Some((1, 2, 3)), and!(Some(1) => Some(2) => Some(3)));
assert_eq!(None, and!(None => Some(2) => Some(3)));
assert_eq!(None, and!(None => None => Some(3)));
assert_eq!(None, and!(None => None => None));
}
struct Config {
log: Option<LogConfig>,
}
struct LogConfig {
level: Option<String>,
}
#[test]
fn try_works() {
assert_eq!(
Some(6),
try_! {
let x = Some(3);
let y = Some(2);
x? * y?
}
);
let config = Config {
log: Some(LogConfig {
level: Some("debug".to_owned()),
}),
};
let x = try_! { config.log?.level? }.unwrap_or("foo".to_owned());
assert_eq!(x, "debug");
}
为什么是 k
option_macros?
这是我用我的姓氏首字母 k
对我的 crate 进行命名空间化的版本。