如何从向量中解包(解构)元素?

时间:2015-09-01 06:08:13

标签: vector iterator rust

我目前正在做以下事情:

let line_parts = line.split_whitespace().take(3).collect::<Vec<&str>>();
let ip = line_parts[0];
let bytes = line_parts[1];
let int_number = line_parts[2];

是否可以做这样的事情?

let [ip, bytes, int_number] = line.split_whitespace().take(3).collect();

我注意到某些网站上有关矢量解构的各种参考,但官方文档似乎并未提及它。

2 个答案:

答案 0 :(得分:6)

你需要的是“切片模式”:

#![feature(slice_patterns)]

fn main() {
    let line = "127.0.0.1 1000 what!?";
    let v = line.split_whitespace().take(3).collect::<Vec<&str>>();

    if let [ip, port, msg] = &v[..] {
         println!("{}:{} says '{}'", ip, port, msg);
    }
}

请注意if let而非普通let。切片模式是 refutable ,因此我们需要考虑到这一点(您可能也希望拥有else分支。)

这需要每晚版本的Rust。

答案 1 :(得分:0)

你也可以使用这个:

let v = line.split_whitespace().take(3).collect::<Vec<&str>>();
let [ip, bytes, int_number] = <[&str; 3]>::try_from(v).ok().unwrap();

<[&str; 3]>::try_from(v) 的返回类型将是 Result type,您可以使用它来处理错误或让它像我一样恐慌,因为我们已经知道大小是 3。