我想试着熟悉铁 rust ,所以我try Crafting Interpreters分.在Longer Lexemes部分中,它有一个peek函数,用于获取当前索引前面的一个字符.

我不知道在铁 rust 里该怎么做.由于语言的设计和Unicode的复杂性,似乎不鼓励对字符串进行索引.

如果我做chars.next(),那么它就会消耗这个值.我认为原始字符串上的.as_bytes()可以工作,但它只支持ASCII值.从互联网上看,.chars().nth().unwrap()是解决方案,但它似乎非常慢.

推荐答案

@BallPointtBen关于使用peekable的 comments 的一个实际例子是:

fn main() {
    let data = "Hello, world!";
    let mut iter = data.chars().peekable();
    
    while let Some(&current) = iter.peek() {
        // Do something with the current character without consuming it
        println!("Current character: {}", current);

        // Now consume the character
        iter.next();
        
        // You can also peek the next character without consuming it
        if let Some(&next) = iter.peek() {
            println!("Next character: {}", next);
        } else {
            println!("This was the last character.");
        }
    }
}

Rust Playground Example

输出:

Current character: H
Next character: e
Current character: e
Next character: l
Current character: l
Next character: l
Current character: l
Next character: o
Current character: o
Next character: ,
Current character: ,
Next character:  
Current character:  
Next character: w
Current character: w
Next character: o
Current character: o
Next character: r
Current character: r
Next character: l
Current character: l
Next character: d
Current character: d
Next character: !

Rust相关问答推荐

为什么实例方法可以像Rust中的静态方法一样被调用?

MPSC频道在接收器处阻塞

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

Rust编译器似乎被结果类型与anyhow混淆

为什么比较Option<;字符串>;具有常数Option<&;str>;需要显式类型转换吗?

如何重命名 clap_derive 中的子命令占位符?

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

在Rust中实现Trie数据 struct 的更好方式

Rust与_有何区别?

`tokio::pin` 如何改变变量的类型?

如何从 rust 中的同一父目录导入文件

如何将这些测试放在一个单独的文件中?

如何判断服务器是否正确接收数据

为什么在 rust 中删除 vec 之前应该删除元素

为什么基于 clap::Parser 读取的大量数字进行计算比硬编码该数字时慢?

BigUint 二进制补码

相互调用的递归异步函数:检测到循环

有什么办法可以用 Rust 访问 Windows 最近的文件夹吗?