在 Rust 中如何将 split 的结果解构为元组?

14

我想在Rust中实现以下内容:

let (command, options) = message.splitn(2, ' ');

由于以下原因,无法完成此操作:

expected struct `std::str::SplitN`, found tuple

拆分始终为两个,并且我喜欢使用命名变量。 该消息可能不包含空格字符。

1个回答

22
splitn()方法返回一个迭代器,它会将字符串分成多个部分。如果你想访问这些部分的话,唯一的方式就是对它们进行迭代访问。如果你知道字符串总是被分成两部分的话,可以使用以下方法访问这两部分:
let mut iter = message.splitn(2, ' ');
let command = iter.next().unwrap();
let options = iter.next().unwrap();

只要message包含至少一个空格字符,这段代码就能正常工作。但对于没有空格的消息,在最后一行将会出现错误,因为迭代器已经终止,所以您将在None上调用unwrap()。(请注意,如果要获取两个项,则需要将2作为splitn()的第一个参数。)

从Rust 1.52开始,您可以使用split_once()方法:

if let Some((command, options)) = message.split_once(' ') {
    // handle command, options
} else {
    // handle error
}

正如评论中所指出的,另一种选择是使用 str::split_at()str::find() 结合使用:

let (command, options) = message.split_at(message.find(' ').unwrap());

请注意,使用这种解决方案将包括空格字符在options中,而其他方法则不包括。


1
我认为str::split_at结合Iterator::position也是很方便的。 - Kitsu
@Kitsu 不错的想法!你需要使用 str::find() 而不是 Iterator::position,因为你需要字节偏移量而不是字符索引,但我会将其添加到答案中。 - Sven Marnach
1
自 Rust 1.52 版本以来,新增了 str::split_once 方法,该方法返回一个元组的 Option。 - Jannis Froese
@JannisFroese 谢谢,我已经在答案中包含了这个。 - Sven Marnach

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