在Rust中分割字符串

6
有没有一种机制可以将Rust中的字符串分成相等长度的元素列表(子字符串或字符元组/数组)?
我想将一个字符串"abcdefghijkl"拆分成类似["ab", "cd", "ef", "gh", "ij", "kl"]的列表。
我不需要手动执行此操作的方法,我只想知道是否有与Clojure的partition相对应的方法。
user> (partition 2 "abcdefghijkl")
((\a \b) (\c \d) (\e \f) (\g \h) (\i \j) (\k \l))
1个回答

6
在当前的Rust主版本中(在Rust 0.9中应该仍然如此),向量和向量切片上有一个名为chunks的方法,它迭代遍历向量,返回等长的向量切片直到耗尽。然而,在字符串或迭代器中没有任何方法可以让你完成这个任务。
为了解决这个问题,请注意,虽然Rust字符串本身不是Rust向量,但它们由包含字符串UTF-8表示的u8向量支持。此外,str类型提供了获取字符串不同视图的方法,特别是:
  • as_bytes: 返回底层 UTF-8 字节向量(&'a [u8])的不可变切片。您可以直接在此上调用 chunks,但由于您正在迭代字节,因此仅当您知道字符串完全是 ASCII 时才会起作用。
  • chars: 返回一个遍历字符串中 Unicode 代码点的迭代器,产生一系列 UTF-32 char 值。

您可以使用 to_owned_vec 方法将迭代器生成的值复制到拥有的、堆分配的向量中,在该向量上运行 chunks

编辑: 这最初声称 chunks 存在于 Rust 0.8 中。实际上,该方法名为 chunk_iter。有关详细信息,请参见评论。


这些方法似乎不在0.8中,尽管这已经足以让我走上正确的路线。 我发现了chunk_iter而不是chunks,它给了我一个ChunkIter。在我可以对其进行任何有用的操作之前,我必须将其clone(),然后最终得到以下结果,`let bytes:&[u8] = "abcdef".as_bytes(); let partitioned:ChunkIter = bytes.chunk_iter(2); for x in partitioned.clone() { println!("{:?}", x); }` - Dan Midwood
1
你可以避免显式类型注释并使用from_utf8来显示字符:`let bytes = "abcdef".as_bytes();` `let mut partitioned = bytes.chunks(2);` `for x in partitioned {` `println(from_utf8(x));` `}`} - Isaac Aggrey
此外,如果您没有chunks,则不应使用master(您应始终使用master)。并且您可以使partitoned变量可变,而不是克隆它(不确定最佳实践是什么...)。 - Isaac Aggrey
1
@DanMidwood 我觉得在0.8版本中,chunks应该是chunk_iter,而chars只是iter - huon
@IsaacAggrey 谢谢。我刚开始学习 Rust,认为 0.8 版本会比主开发分支更稳定,更容易学习。现在我可能要重新考虑一下了。 - Dan Midwood
而明确的类型注释,它们主要是为了帮助我的记忆。 - Dan Midwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接