2016-04-03 5 views
13

क्या मैं जंग (शायद हां) में पैरामीटर के रूप में एक फ़ंक्शन पास कर सकता हूं, यदि यह संभव है तो मैं कर सकता हूं।जंग में आप पैरामीटर के रूप में फ़ंक्शन कैसे पास करते हैं?

यदि आप नहीं कर सकते हैं, जो एक अच्छा विकल्प है।

मैं कुछ वाक्य रचना की कोशिश की, लेकिन मैं


नहीं मिला है मैं जानता हूँ कि मैं एक समारोह

..// 
fn funTest(value: i32, (some_function_prototype)) -> i32 { 
    println!("{}", value); 
    value 
} 
को पैरामीटर के रूप समारोह गुजर के रूप में इस

..// 

let fun: fn(value: i32) -> i32; 
fun = funTest; 
fun(5i32); 

..// 
fn funTest(value: i32) -> i32 { 
    println!("{}", value); 
    value 
} 

लेकिन नहीं कर सकते हैं

उत्तर

22

सुनिश्चित करें कि आप कर सकते हैं:

fn funTest(value: i32, f: &Fn(i32) -> i32) -> i32 { 
    println!("{}", f(value)); 
    value 
} 

fn times2(value: i32) -> i32 { 
    2 * value 
} 

fn main() { 
    funTest(5, &times2); 
} 

लेकिन यह जंग है इसलिए आपको ownership and lifetime of the closure पर ध्यान देना होगा।

टीएल; डीआर;

  1. Fn: मूल रूप से वहाँ बंद के 3 प्रकार (प्रतिदेय वस्तुओं) कर रहे हैं सबसे सामान्य है, यह एक शुद्ध कार्य है।
  2. FnMut: यह उन वस्तुओं को संशोधित कर सकता है जो इसे कैप्चर करते हैं।
  3. FnOnce: सबसे प्रतिबंधित। केवल एक बार बुलाया जा सकता है क्योंकि जब इसे कहा जाता है तो यह स्वयं और उसके कब्जे का उपभोग करता है।

यदि आप बंद करने जैसे साधारण पॉइंटर-टू-फ़ंक्शन का उपयोग कर रहे हैं, तो कैप्चर सेट खाली है और आपके पास Fn स्वाद है।

यदि आप अधिक फैंसी सामान करना चाहते हैं, तो आपको लैम्ब्डा फ़ंक्शंस का उपयोग करना होगा।

+0

या दो कामों (.., एफ: और एफएन ...) का उपयोग करने में कोई अंतर नहीं है, कुछ विवरण जो मुझे जानना है? –

+0

@ एंजेलएंजेल: ठीक है, 'एफएन * 'लक्षण हैं, इसलिए सामान्य' ' बनाम '(टी: और टी) 'लागू होता है। गैर-जेनेरिक समाधान की मुख्य सीमा यह है कि इसका संदर्भ संदर्भों के साथ किया जाना चाहिए। तो यदि आप 'FnOnce' चाहते हैं, जिसे प्रतिलिपि के रूप में पारित किया जाना चाहिए, तो आपको सामान्य शैली का उपयोग करना होगा। – rodrigo

+2

ध्यान दें कि यह विशेषता वस्तुओं (यानी '' '(एफ: और एफएन ...) के बजाय जेनरिक का उपयोग करने के लिए अधिक मूर्खतापूर्ण है। और यह एक कारण के लिए है - जेनेरिक का परिणाम स्थैतिक प्रेषण होगा, जबकि लक्षण वस्तुओं की आवश्यकता होती है गतिशील प्रेषण। –

6

Fn, FnMut और FnOnce, अन्य जवाब में बताया गया है, बंद प्रकार हैं। उनके दायरे को बंद करने वाले कार्यों के प्रकार।

गुजर बंद से

अलावा जंग भी सरल (गैर बंद) कार्यों गुजर, इस तरह का समर्थन करता है:

fn times2(value: i32) -> i32 { 
    2 * value 
} 

fn fun_test(value: i32, f: fn(i32) -> i32) -> i32 { 
    println!("{}", f (value)); 
    value 
} 

fn main() { 
    fun_test (2, times2); 
} 

यहाँ fn(i32) -> i32 एक function pointer type है।

यदि आपको फ़ंक्शन प्रकारों के साथ काम करने की तुलना में पूर्ण रूप से बंद होने की आवश्यकता नहीं है तो अक्सर उन आसान जीवनकाल की निपुणताओं से निपटने की आवश्यकता नहीं होती है।

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