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

标签 rust

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

    相关文章:

    global-variables - 是否可以在 Rust 中使用全局变量?

    generics - 将泛型参数与 impl 中的关联类型匹配

    multithreading - 为什么 Condvar 不唤醒最后一个线程?

    rust - 在 Rust 中以 f64 为单位读取二进制文件

    rust - Rust 宏可以设置变量并同时返回值吗?

    android - 如何将 Flutter 应用程序的构建过程与 Rust 代码集成?即在构建 Flutter 代码时,如何自动构建其 Rust 代码?

    rust - 如何从同一类型的另一个方法内部调用带有 &mut self 的方法?

    rust - 当它掉落时,我如何确定我是否拥有独特的 Arc?

    rust - 如何从流中读取特定数量的字节?

    rust - super 客户端无法查找在 IPv6 本地主机上运行的服务器的地址信息