gpt4 book ai didi

rust - 一个从切片中获取 X 元素的衬垫

转载 作者:行者123 更新时间:2023-12-03 11:40:32 26 4
gpt4 key购买 nike

我有一个方法需要 &[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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com