在 Rust 中将拆分为元组解包?

Fol*_*att 7 split tuples rust

我想在 Rust 中执行以下操作:

let (command, options) = message.splitn(2, ' ');
Run Code Online (Sandbox Code Playgroud)

无法做到这一点,因为:

expected struct `std::str::SplitN`, found tuple
Run Code Online (Sandbox Code Playgroud)

拆分将始终是两个,我喜欢命名变量。该消息可能不包含空格字符。

Sve*_*ach 11

splitn()方法返回一个迭代器,因此访问它们的唯一方法是实际迭代它们。如果你知道总是有两个部分,你可以这样做:

let mut iter = message.splitn(2, ' ');
let command = iter.next().unwrap();
let options = iter.next().unwrap();
Run Code Online (Sandbox Code Playgroud)

只要message包含至少一个空格字符,这将正常工作。对于没有空间的消息,这将恐慌在最后一行,因为迭代器已经终止,所以你会叫unwrap()None。(请注意,splitn()如果您想获得两个项目,则需要 2 作为第一个参数。)

使用itertools板条箱,您可以使用以下collect_tuple()方法:

use itertools::Itertools;
let (command, options) = message.splitn(2, ' ').collect_tuple().unwrap();
Run Code Online (Sandbox Code Playgroud)

如果迭代器只返回一个项目,这也会引起恐慌。

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

let (command, options) = message.split_at(message.find(' ').unwrap());
Run Code Online (Sandbox Code Playgroud)

请注意,options此解决方案将包含空格字符,而其他方法不包含它。