unfmt
unfmt
是一个编译时模式匹配库,它可以反转format!
的插值过程。
你可以将它视为一个极其轻量级的正则表达式引擎,无需运行时模式编译成本。
安装
cargo add -D unfmt
使用方法
let value = "My name is Rho.";
// 未命名的捕获以元组形式返回。
assert_eq!(
unformat!("My {} is {}.", value),
Some(("name", "Rho"))
);
// 你也可以使用索引;只需确保所有捕获都使用索引,
// 否则结果将无法明确定义。
assert_eq!(
unformat!("My {1} is {0}.", value),
Some(("Rho", "name"))
);
// 你还可以使用变量命名捕获,但要确保检查
// 返回值不是None。
let mut subject = None;
let mut object = None;
assert_eq!(
unformat!("My {subject} is {object}.", value),
Some(())
);
assert_eq!((subject, object), (Some("name"), Some("Rho")));
// 如果你想确保整个字符串都匹配,可以在宏的末尾添加`true`。
assert_eq!(unformat!("{1} is {0}", value, true), None);
// 如果一个类型实现了`FromStr`,你可以将其用作类型参数。
// 这种写法为`{:Type}`。
assert_eq!(
unformat!("Listening on {:url::Url}", "Listening on http://localhost:3000"),
Some((url::Url::from_str("http://localhost:3000").unwrap(),))
);
通常,捕获的写法为{<索引或变量>:<类型>}
。不支持连续多个捕获(如{}{}
),因为它们的含义不明确。
限制
- 不支持回溯。