Rust 一个用于从切片中获取X元素的衬里

Rust 一个用于从切片中获取X元素的衬里,rust,Rust,我有一个采用&[u8]的方法,我需要从开始到特定索引提取元素,将它们复制到字符串中。我可以使用一个循环来遍历它,但是是否有一个线性行可以这样做,这样我就丢失了?如果初始序列是seq,索引是idx,那么它就是String::from_utf8seq[…idx]。to_vec.unwrap。按步骤: seq[…idx]获取所需的切片&[u8]; seq[…idx].tovec将此切片转换为vec当然,昂贵的克隆正在进行,但如果切片是不可变的,则这是必要的; 字符串::from_utf8seq[…id

我有一个采用&[u8]的方法,我需要从开始到特定索引提取元素,将它们复制到字符串中。我可以使用一个循环来遍历它,但是是否有一个线性行可以这样做,这样我就丢失了?

如果初始序列是seq,索引是idx,那么它就是String::from_utf8seq[…idx]。to_vec.unwrap。按步骤:

seq[…idx]获取所需的切片&[u8]; seq[…idx].tovec将此切片转换为vec当然,昂贵的克隆正在进行,但如果切片是不可变的,则这是必要的; 字符串::from_utf8seq[…idx]。to_vec尝试就地将vec转换为字符串。因为字符串应该有一个有效的UTF8位序列,所以它检查这个条件并返回一个结果。这里不进行克隆:相反,字符串获得Vec的所有权并重用其内容。文件: 最后,如果确定UTF8表示正确,则“展开”将结果转换为字符串。或者,您可以使用.expecterror消息或使用match来处理可能的编码错误。 编辑: 评论中建议了一种更好的方法:std::str::from_utf8&x[…idx].unwrap。这与此类似,但避免分配新内存。您可以将其绑定到&str类型的变量,而不是String类型的变量-它们在许多方面都是可互换的。
如果确实需要字符串,可以分配新内存,并通过字符串::fromstd::str::from_utf8&x[…idx].展开进行转换。与上面的方法相比,这有一个优点,即当片不是有效的UTF8时,可以避免内存分配。

您还没有说明如何在字符串中格式化它们。下面是一种尝试,假设您希望将每个u8转换为其十进制表示形式并用逗号分隔:

fn foo(s: &[u8], index: usize) -> String {
    s[..index].iter().map(u8::to_string).collect::<Vec<_>>().join(",")
}

在这种情况下,您可能希望返回一个结果,而不是像我在本例中所做的那样展开?现在还不清楚你想要这些元素如何。。。克隆或引用提取到Vec中?子片?我想将它们克隆成一个字符串。您可以使用std::str::from_utf8,它需要一个字节片,因此不需要为向量分配。然后将字符串片段转换为字符串,然后在将&str转换为字符串时进行分配。字符串是拥有的集合,因此它不能重用属于其他集合的内容;否则,借阅检查器将不可能强制执行任何人都没有对字符串内容的可变引用。但是,如果您实际上没有对切片进行变异,那么std::str::from_utf8也是一个好主意,这是正确的。在这种情况下,您可能根本不需要创建字符串。实际上,它们应该是相同的,因为String::from_utf8调用std::str::from_utf8,但在字节片无效的情况下,std::str::from_utf8的分配更少
fn bar(s: &[u8], index: usize) -> String {
    String::from_utf8(s[..index].to_vec()).unwrap()
}