我有一个方法需要 &[u8]
我需要从开始提取元素到特定索引,将它们复制到 String
.我可以使用循环来遍历它,但是是否有一个单行线可以让我错过?
最佳答案
如果初始序列是seq
并且索引是idx
,则为 String::from_utf8(seq[..idx].to_vec()).unwrap()
.按步骤:
seq[..idx]
得到想要的切片 &[u8]
; seq[..idx].to_vec()
将此切片转换为 Vec<u8>
(当然,昂贵的克隆正在进行,但如果切片是不可变的,这是必要的); String::from_utf8(seq[..idx].to_vec())
尝试转换 Vec<u8>
成一个字符串到位。由于String
应该有一个有效的 UTF8 位序列,它会检查这个条件并返回一个 Result
.这里没有发生克隆:取而代之的是 String
拥有Vec
并重用其内容。文档:https://doc.rust-lang.org/std/string/struct.String.html#method.from_utf8 .unwrap()
转换 Result
进入 String
如果您确定 UTF8 表示是正确的。或者,您可以使用 .expect("error message")
或使用 match
处理可能的编码错误。 编辑:
评论中提出了更好的方法:
std::str::from_utf8(&x[..idx]).unwrap()
.这类似,但避免分配新内存。您可以将其绑定(bind)到 &str
类型的变量。而不是 String
- 它们可用于多种用途。如果你真的想要
String
, 可以通过String::from(std::str::from_utf8(&x[..idx]).unwrap())
分配新内存并转换.与上面的方法相比,这有一个优点,即当切片不是有效的 UTF8 时,可以避免内存分配。
关于rust - 一个从切片中获取 X 元素的衬垫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64072091/