#text-input #input #text #scanner #java #utils #handler

file_scanner

基于 java.util.Scanner 的高级文本输入处理器

6 个版本

使用旧的 Rust 2015

0.2.0 2018年2月4日
0.1.4 2018年2月2日

#2657解析器实现

34 每月下载量
vampire_api 中使用

MIT 许可证

3.5MB
324

包含 (WOFF 字体, 120KB) docs/Heuristica-Italic.woff, (WOFF 字体, 90KB) docs/FiraSans-Medium.woff, (WOFF 字体, 92KB) docs/FiraSans-Regular.woff, (WOFF 字体, 56KB) docs/SourceCodePro-Regular.woff, (WOFF 字体, 56KB) docs/SourceCodePro-Semibold.woff, (WOFF 字体, 49KB) docs/SourceSerifPro-Bold.woff 和更多.

Scanner 构建状态 crates.io codecov

Java 的 java.util.Scanner 接口的 Rust 版本

安装/入门

该项目可在 crates.io 上找到。

对于最新版本,请始终检查此存储库。

开发

代码应根据 rustfmt 进行格式化。当前路线图中没有需要使用 unsafe 块的行为。

所有 unwrap() 应该立即跟在一个检查它们是否安全的检查之后,或者包含一个解释为什么它们可以保证是安全的注释。

我们遵循测试驱动开发。将 java.util.Scanner 的行为作为测试的参考实现,除了在应该使用包装返回值(例如,OptionResult)的情况下不应抛出异常。这将使我们与 Java 的某些地方不一致。

最后,祝大家玩得开心。没有必要对Java的1:1兼容性过于严格,但这确实提供了一个良好的模式,用于处理复杂的IO,而不需要像C和C++那样使用变长函数或运算符重载。我们试图保持兼容性,以便熟悉Java Scanner语法的开发者能够快速学习,但这也是一个提出对Java Scanner不满的机会,只要你能够合理地证明它。

部署/发布

只需将 file_scanner = "0.2.0" 添加到您的 [dependencies] 中。

注意与之前版本的更改:我们现在接受一个实现 Read 的不可变对象,而不是一个指向实现 BufRead 的对象的可变引用。请参阅下面的示例代码。

extern crate file_scanner;
use file_scanner::Scanner;

//snip

let file = File::open(...)?;
let mut s = Scanner::new(file);

let int = s.next_int().unwrap();
let bin = s.next_int_radix(2).unwrap();
let real = s.next_float().unwrap();
let hex_real = s.next_float_radix(16).unwrap();

let word = s.next().unwrap();
let line = s.next_line().unwrap();

s.set_delim_str("[ foo ]");  // words will now be delimited by "[ foo ]"

// words are delimited by whitespace (this is the default behavior)
s.set_delim(Regex::new(r"\s+").unwrap());

s.set_radix(2);  // future calls to next_int or next_float will use binary
s.set_radix(16);  // hexadecimal
s.set_radix(36);  // alphanumeric
// or anything in between

有关完整文档,请参阅 https://hxtk.github.io/Rust-Scanner/file_scanner/

注意我们目前正在跟踪一个错误,即先验分隔符大于缓冲区时无法检测。有关详细信息,请参阅 问题 #4

功能

完整

  • 扫描仪.next() -> 选项<字符串>

  • 扫描仪.next_line() -> 选项<字符串>

  • 扫描仪.next_int<T:整数>() -> 选项<T>

  • 支持正则语言分隔符*

  • 扫描仪.next_float<T:浮点数>() -> 选项<T>

  • 任意基数整数解析

路线图

  • 扫描仪.has_next*

贡献

一般来说,您可以自由地开发我们尚未在此处实现的任何在 java.util.Scanner 中找到的功能。仓库所有者保留拒绝拉取请求的权利。以下是一些确保您的拉取请求被接受的建议

  • 对您正在编写的功能的问题发表评论。如果没有问题,请创建一个。

  • 获得一位主要贡献者的批准。

  • 为您的功能包含单元测试。如果与 java.util.Scanner 具有匹配,请确保这些测试与其实际行为相匹配(请参阅“开发”部分下的异常注意事项)。

如果您没有时间实现功能,最好的帮助方式之一就是吹毛求疵(礼貌地)。首席开发者仍然是Rust和软件工程的一般学生。

依赖关系

~3.5MB
~78K SLoC