Rust 如何在固定索引处对字符串进行分区?

Rust 如何在固定索引处对字符串进行分区?,rust,Rust,我有一个字符串(特别是一个SHA1十六进制摘要),我想将其拆分为两个子字符串——前两个字符和字符串的其余部分。在Rust中是否有一种干净的方法可以做到这一点?如果您知道您的字符串只包含ASCII字符(与sha摘要一样),则可以直接使用切片: let s = "13e3f28a65a42bf6258cbd1d883d1ce3dac8f085"; let first = &s[..2]; // "13" let rest = &s[2..]; // "e3f28a65a42bf

我有一个字符串(特别是一个SHA1十六进制摘要),我想将其拆分为两个子字符串——前两个字符和字符串的其余部分。在Rust中是否有一种干净的方法可以做到这一点?

如果您知道您的字符串只包含ASCII字符(与sha摘要一样),则可以直接使用切片:

let s = "13e3f28a65a42bf6258cbd1d883d1ce3dac8f085";
let first = &s[..2];  // "13"
let rest = &s[2..];   // "e3f28a65a42bf6258cbd1d883d1ce3dac8f085"

如果字符串包含非ASCII字符,因为切片使用字节偏移量,并且如果切片中使用的任何索引指向代码点表示的中间,则程序将无法正常工作。

如果希望使用两个
字符串而不是切片,则可以使用
字符()
方法和一些
迭代器
方法来获取它们

let text = "abcdefg".to_string();
let start: String = text.chars().take(2).collect();
let end: String = text.chars().skip(2).collect();
如果不想进行堆分配,可以改用切片:

let start: &str = text.slice_chars(0, 2);
let end: &str = text.slice_chars(2, text.char_len());

请注意,slices版本要求您使用不稳定的rust(夜间构建,而不是beta版)

如果您拥有此字符串数据,这里有一种方法可以有效地将字符串拆分为两个字符串。输入字符串的分配仅通过使用截断保留在第一部分中

/// Split a **String** at a particular index
///
/// **Panic** if **byte_index** is not a character boundary
fn split_string(mut s: String, byte_index: usize) -> (String, String)
{
    let tail = s[byte_index..].into();
    s.truncate(byte_index);
    (s, tail)
}
注意:into()方法是从泛型转换特征转换为,在本例中,它将&str转换为字符串

自Rust 1.4以来,有一种方法,使用如下:

let s = "13e3f28a65a42bf6258cbd1d883d1ce3dac8f085";
let (first, last) = s.split_at(2);

assert_eq!("13", first);
assert_eq!("e3f28a65a42bf6258cbd1d883d1ce3dac8f085", last);

请注意,索引是字节位置,必须位于字符边界上。在本例中,这是有效的,因为您知道输入字符串是ASCII。

在Vladimir所说的基础上,我鼓励您为SHA1创建一个新类型,该类型指示所有字符都是字母数字(比ASCII更严格)。然后,您可以选择以任何有意义的方式(可能是Vec)在内部存储它。