我试图在Rust中为字符串编制索引,但编译器抛出了一个错误.我的代码(Euler problem 4playground):

fn is_palindrome(num: u64) -> bool {
    let num_string = num.to_string();
    let num_length = num_string.len();

    for i in 0 .. num_length / 2 {
        if num_string[i] != num_string[(num_length - 1) - i] {
            return false;
        }
    }

    true
}

错误是:

error[E0277]: the trait bound `std::string::String: std::ops::Index<usize>` is not satisfied
 --> <anon>:7:12
  |
7 |         if num_string[i] != num_string[(num_length - 1) - i] {
  |            ^^^^^^^^^^^^^
  |
  = note: the type `std::string::String` cannot be indexed by `usize`

String不能被索引有什么原因吗?那我怎么才能访问数据呢?

推荐答案

是的,Rust中没有索引到字符串的功能.这是因为Rust字符串在内部是用UTF-8编码的,所以索引本身的概念很模糊,人们会误用它:字节索引很快,但几乎总是不正确的(当文本包含非ASCII符号时,字节索引可能会将您留在字符中,如果需要文本处理,这是非常糟糕的),而字符索引不是免费的,因为UTF-8是一种可变长度编码,所以您必须遍历整个字符串以找到所需的代码点.

如果确定字符串只包含ASCII字符,可以在&str上使用as_bytes()方法返回字节片,然后索引到此片:

let num_string = num.to_string();

// ...

let b: u8 = num_string.as_bytes()[i];
let c: char = b as char;  // if you need to get the character as a unicode code point

如果确实需要索引代码点,则必须使用char()迭代器:

num_string.chars().nth(i).unwrap()

如上所述,这将需要遍历整个迭代器,直到第i个代码元素.

最后,在文本处理的许多情况下,实际上需要使用grapheme clusters而不是代码点或字节.借助unicode-segmentation crate ,您还可以索引到grapheme集群:

use unicode_segmentation::UnicodeSegmentation

let string: String = ...;
UnicodeSegmentation::graphemes(&string, true).nth(i).unwrap()

当然,grapheme集群索引对遍历整个字符串的要求与对代码点的索引要求相同.

Rust相关问答推荐

使用nom将任何空白、制表符、白线等序列替换为单个空白

为什么单元类型(空元组)实现了`Extend`trait?

如何访问Rust存储值的内存地址

如何装箱生命周期相关联的两个对象?

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

带参考文献的 rust 元组解构

创建Rust中元对象协议的动态对象 Select /重新分配机制

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

在0..1之间将U64转换为F64

将一个泛型类型转换为另一个泛型类型

减少指示ProgressBar在Rust中的开销

borrow 是由于对 `std::sync::Mutex>` 的解引用强制而发生的

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

Rust 中多个 & 符号的内存表示

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

go 重并堆积MPSC通道消息

borrow 匹配手臂内部的可变

`移动||异步移动{...}`,如何知道哪个移动正在移动哪个?

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?