将元组解压缩为参数

时间:2016-10-05 15:41:30

标签: rust tuples

如果我想解压缩一个元组并将其作为参数传递,有一种方法可以做到这一点:

//Does not compile
fn main() {
    let tuple = (10, Vec::new());
    foo(tuple);
}
fn foo(a: i32, b: Vec<i32>) {
    //Does stuff.
}

而不是必须这样做:

fn main() {
    let tuple = (10, Vec::new());
    foo(tuple.0, tuple.1);
}
fn foo(a: i32, b: Vec<i32>) {
    //Does stuff.
}

3 个答案:

答案 0 :(得分:12)

在夜间编译器上:

#![feature(fn_traits)]

fn main() {
    let tuple = (10, Vec::new());
    std::ops::Fn::call(&foo, tuple);
}
fn foo(a: i32, b: Vec<i32>) {
}

AFAIK没有稳定的方法可以做到这一点。

答案 1 :(得分:7)

有一种方法,使用模式匹配的魔力:

fn main() {
    let tuple = (10, Vec::new());
    foo(tuple);
}

fn foo((a, b): (i32, Vec<i32>)) {
    // do stuff
}

根据Rust reference

  

与let绑定一样,函数参数是无可辩驳的模式,所以   在let绑定中有效的任何模式也有效   参数。

所以你可以指定一个参数:

(a, b): (i32, Vec<i32>)

就像在let声明中一样。

答案 2 :(得分:3)

let (a, b) = (10, Vec::new());
foo(a, b);