2 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2018年12月28日 |
---|---|
0.1.0 | 2018年12月26日 |
#69 in #scanner
用于 darkly
23KB
536 行
Darkly
一个扫描库和宏。
示例
fn main() {
println!("Enter coordinates in the form (x, y)");
scanln!("({}, {})", x: i32, y);
let typed_y: i32 = y;
println!("You entered x: {}, y: {}", x, typed_y);
}
输入 (0, 42)
给出输出 您输入了 x: 0, y: 42
。
扫描宏
目前提供一个 scanln
宏,该宏每次从 stdin 读取一行并扫描。我计划添加 readln
以从任何读取器中读取行,也许还会添加非-ln 版本。
scanln
宏试图与 println
的反向操作类似,它接受一个带有空位的查询字符串和变量列表。每个空位必须与一个变量匹配。文本字符将与输入精确匹配,中间的数据将分配到适当的变量中。如果输入与文本不匹配或类型不正确,则扫描器会恐慌(但请参阅以下内容)。
传递给 scanln
的变量可以是未指定的(例如,scanln!("{}", x)
),在这种情况下,类型将根据变量的使用来推断。这会生成类似于以下代码的代码: let x = FromStr::from_str(read(...));
。
或者它们可以键入(例如,scanln!("{}", x: u32)
)。这会生成类似以下代码:let x: u32 = FromStr::from_str(read(...));
。
在任一情况下,变量的类型必须实现std::str::FromStr
。
正在进行中
- 使用
{:?}
来使用Serde反序列化数据(参照{}
使用FromStr
), readln!
从Reader读取,而不仅仅是stdin,- 转义
{
和}
, - 基于类型(见下文)的基于
Result
而不是panic的选项, - 其他查询字符串功能,类似于
println
等。
非panic版本
目前,如果输入与查询字符串不匹配,scanln
会panic。这在简单情况下很方便,但不健壮。为了允许scanln
的用户自己处理错误,我计划实现非panic模式。无论scanln
是否panic,将取决于类型
scanln!("{}", x: u32); // Panics if can't parse as u32
scanln!("{}", x: Result<u32, _>); // Returns an Err if can't parse as u32
实现这一点并不完全可能 - 我们需要特化特质扩展的'格规则'。这目前正在开发中,当它到来时,上述内容应该通过扩展darkly-scan库来实现,希望宏已经准备好使用。
darkly-scanner
底层扫描库。需要文档...
依赖关系
~2MB
~46K SLoC