1 个不稳定版本

0.1.0 2023年11月22日

#1 in #indexable

MIT 许可证

13KB
158

indexable_str

这个 Rust 库具有 IndexableStr 结构体。为了更好地理解 Rust 中的字符串工作方式,我决定创建一个个人项目来解析 JSON 文件。在创建词法分析器时,我尝试了多种方法来正确索引字符串以检索字符串切片和 char。当我最终开始理解 Rust 字符串和生命周期时,我创建了一个简单的 IndexableStr 版本。我发现它非常方便使用,并且它使我的代码比之前尝试的任何笨拙方法都要易于阅读。因为其他人也可能觉得它很有用,所以我决定将 IndexableStr 分离成一个独立的库项目。

查看 rustdoc 文件 了解 API 详细信息。

示例

// Gets a char from a specified index.
use indexable_str::IndexableStr;

let s = IndexableStr::new("0😀2345678😀");

assert_eq!(s[1], '😀');
// Gets a string slice from a specified range.
use indexable_str::IndexableStr;

let s = IndexableStr::new("0😀2345678😀");

assert_eq!(&s[1..9], "😀2345678")
// Parses a string of signed integers, which are separated by whitespace
use regex::Regex;
use indexable_str::IndexableStr;
  
let text = IndexableStr::new("0 1 2\n  -11  -12  -13\n");
let signed_integer_pattern: Regex = Regex::new(r#"\b(0)|(-?[1-9]\d*)\b"#).unwrap();
let mut signed_integer_vec: Vec<i64> = Vec::new();
let mut cursor: usize = 0;
 
while cursor < text.len() {
   let c = text[cursor];

    match c {
        ' ' | '\t' | '\r' | '\n' => {
            cursor += 1;
            continue;
        },
        _=> (), 
    }

    if let Some(captures) = signed_integer_pattern.captures(&text[cursor..]) {
        let num_string = captures[0].to_string();
        let num = num_string.parse::<i64>();
        signed_integer_vec.push(num.unwrap());

        cursor += num_string.len();

        continue;
    }

    panic!("Unexpected character '{}' at position ({})!", c, cursor);
}
 
assert_eq!(signed_integer_vec.len(), 6);
assert_eq!(signed_integer_vec[0], 0);
assert_eq!(signed_integer_vec[1], 1);
assert_eq!(signed_integer_vec[2], 2);
assert_eq!(signed_integer_vec[3], -11);
assert_eq!(signed_integer_vec[4], -12);
assert_eq!(signed_integer_vec[5], -13);

无运行时依赖