Распаковка кортежей в аргументы

Если я хочу распаковать кортеж и передать его в качестве аргументов, есть способ сделать это:

//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.
}

Ответы

Ответ 1

На ночном компиляторе:

#![feature(fn_traits)]

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

У AFAIK нет стабильного способа сделать это.

Ответ 2

Существует способ, используя магию соответствия шаблону:

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

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

По ссылке Rust:

Как и в случае с привязками привязки, аргументы функции являются неопровержимыми шаблонами, поэтому любой шаблон, который является допустимым в привязке let, также действителен в качестве аргумента.

Таким образом, вы можете указать аргумент, например:

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

точно так же, как в предложении let.

Ответ 3

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