#macro #input #scanner #darkly #scanln

darkly-macros

支持 Darkly crate 的宏

2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2018年12月28日
0.1.0 2018年12月26日

#69 in #scanner


用于 darkly

Apache-2.0/MIT

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