我想在Rust中实现以下内容:
let (command, options) = message.splitn(2, ' ');
由于以下原因,无法完成此操作:
expected struct `std::str::SplitN`, found tuple
拆分始终为两个,并且我喜欢使用命名变量。 该消息可能不包含空格字符。
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
中,而其他方法则不包括。
str::split_at
结合Iterator::position
也是很方便的。 - Kitsustr::find()
而不是Iterator::position
,因为你需要字节偏移量而不是字符索引,但我会将其添加到答案中。 - Sven Marnachstr::split_once
方法,该方法返回一个元组的 Option。 - Jannis Froese