2 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2018 年 12 月 28 日 |
---|---|
0.1.0 | 2018 年 12 月 26 日 |
#1616 在 Rust 模式
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