将元组解压缩为参数

HiD*_*der 21 tuples rust

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

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

而不是必须这样做:

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

mca*_*ton 12

在夜间编译器:

#![feature(fn_traits)]

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

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

  • @ljedrz我以为他不想/不能改变功能签名. (3认同)
  • 是的,在这种情况下,我也不会看到任何其他方式。 (2认同)

lje*_*drz 11

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

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

fn foo((a, b): (i32, Vec<i32>)) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

根据Rust参考:

与let绑定一样,函数参数是无可辩驳的模式,因此任何在let绑定中有效的模式也可以作为参数有效.

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

(a, b): (i32, Vec<i32>)
Run Code Online (Sandbox Code Playgroud)

就像你在let声明中一样.

  • 您能详细说明一下吗?这不是就像用一个恰好是元组的单个参数调用函数一样吗? (6认同)
  • @piotao 是的,“foo”是一个采用元组的单参数函数。恰巧元组立即被模式匹配并解压缩到函数参数中。 (3认同)
  • 该提案没有解决“解压元组并将其作为参数**S**传递”的需要(强调我的)。 (3认同)

Lee*_*Lee 6

let (a, b) = (10, Vec::new());
foo(a, b);
Run Code Online (Sandbox Code Playgroud)

  • 我赞成,但如果它明确回答问题而不是仅仅提供替代代码,这个答案会更好。 (7认同)