#scanner #input #macro #scan #scanf-style #scanln

nightly darkly

一个简单的 scanf 风格扫描器

2 个不稳定版本

使用旧的 Rust 2015

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

#1616Rust 模式

Apache-2.0/MIT

17KB
359

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,
  • 转义 {}
  • 基于类型(见下文)而不是 panic 的基于 Result 的选项,
  • 其他查询字符串功能,类似于 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

实现这一点并不完全可能 - 我们需要 trait 特化中的 'lattice rule' 扩展。目前正在进行相关工作,当该扩展可用时,上述功能应该可以通过扩展 darkly-scan 库来实现,希望宏已经准备好。

darkly-scanner

底层的扫描库。需要文档...

依赖项

~2MB
~46K SLoC