How can I unpack (destructure) elements from a vec

2020-08-25 05:16发布

I am currently doing the following:

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];

Is it possible to do something like this?

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

I'm noticed various references to vector destructuring on some sites but the official docs don't seem to mention it.

1条回答
一夜七次
2楼-- · 2020-08-25 05:56

It seems what you need is "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);
    }
}

Playground link

Note the if let instead of plain let. Slice patterns are refutable, so we need to take this into account (you may want to have an else branch, too).

查看更多
登录 后发表回答