2016-10-05 3 views
13

Wenn ich will ein Tupel entpacken und geben es als Argumente gibt es eine Möglichkeit, dies zu tun:Auspacken Tupeln in Argumente

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

Statt der dies zu tun:

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

Antwort

10

Auf einem nächtlichen Compiler:

#![feature(fn_traits)] 

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

AFA Es gibt IK keine stabile Möglichkeit, das zu tun.

+0

Aber da ist, siehe meine Antwort. – ljedrz

+2

@ljedrz Ich nahm an, dass er die Funktionssignatur nicht ändern wollte/konnte. – mcarton

+0

In diesem Fall würde ich auch keinen anderen Weg sehen. – ljedrz

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

Ich uploated, aber diese Antwort wäre besser, wenn es explizit die Frage beantwortet, anstatt nur alternativen Code anzubieten. – trentcl

3

Es gibt einen Weg, um die Magie des Pattern-Matching mit:

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

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

Per Rust reference:

Wie bei let-Bindungen, Funktionsargumente unwiderlegbare Muster sind, so jedes Muster, das ist gültig in einer Let-Bindung ist auch gültig als Argument.

So können Sie ein Argument wie angeben:

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

wie würden Sie in einer let Aussage.