2016-10-05 11 views
13

मैं एक टपल खोल और इसे पारित करने के रूप में तर्क वहाँ यह करने के लिए एक तरीका है चाहते हैं:तर्क में Unpacking 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. 
} 

उत्तर

10

एक रात के कंपाइलर पर:

#![feature(fn_traits)] 

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

AFA है आईके ऐसा करने का कोई स्थिर तरीका नहीं है।

+0

लेकिन मेरा जवाब देखें। – ljedrz

+2

@ljedrz मुझे लगता है कि वह नहीं चाहता था/फ़ंक्शन हस्ताक्षर नहीं बदल सका। – mcarton

+0

उस मामले में हाँ, मैं किसी भी अन्य तरीके से नहीं देखूंगा। – ljedrz

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

मैंने ऊपर उठाया, लेकिन यह जवाब बेहतर होगा अगर उसने वैकल्पिक कोड की पेशकश करने के बजाय स्पष्ट रूप से प्रश्न का उत्तर दिया। – trentcl

3

एक तरीका होता है, पैटर्न मिलान के जादू का उपयोग कर:

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

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

के अनुसार Rust reference:

लेट बाइंडिंग के साथ के रूप में, समारोह तर्क अकाट्य पैटर्न, किसी भी पैटर्न है कि कर रहे हैं तो एक लेट बाध्यकारी में मान्य तर्क के रूप में भी मान्य है। वैसा ही जैसे एक let बयान में होगा

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

:

तो आप की तरह एक तर्क निर्दिष्ट कर सकते हैं।

संबंधित मुद्दे