मैं एक फ़ंक्शन फ़ैक्टरी, यानी एक उच्च ऑर्डर फ़ंक्शन पास करना चाहता हूं, लेकिन मुझे call expression requires function त्रुटियां मिलती हैं।

// function that takes 4 f32 generates a function which maps one f32 to another f32
// DOESN'T WORK
type FunctionFactoryType = Box<dyn Fn(f32, f32, f32, f32) -> (dyn Fn(f32) -> f32)>;

fn abc(x: FunctionFactoryType) {
    (*x)(1.0, 2.0, 3.0, 4.0);
    // ^ call expression requires function
    // expected function, found `(dyn Fn(f32, f32, f32, f32) -> (dyn Fn(f32) -> f32 + 'static) + 'static)`
}

अगर मैं "नियमित कार्य" (उच्च क्रम नहीं) का उपयोग करता हूं, यानी Box<dyn Fn(f32 -> f32)> यह काम करता है। क्या मुझे कुछ याद आ रहा है या यह एक जंग त्रुटि है?

2
phip1611 16 मार्च 2021, 02:00

2 जवाब

सबसे बढ़िया उत्तर

यदि आप सीधे dyn Fn के बजाय बाहरी dyn Fn रिटर्न Box<dyn Fn> करते हैं, तो आपका कॉल संकलित हो जाता है:

type FunctionFactoryType = Box<dyn Fn(f32, f32, f32, f32) -> Box<dyn Fn(f32) -> f32>>;

(ध्यान दें कि Box<Fn...> को कॉल करने के लिए आपको (*x)(...) की आवश्यकता नहीं है, आप केवल x(...) का उपयोग कर सकते हैं।)

dyn Fn(...) का रिटर्न प्रकार मान्य नहीं है क्योंकि dyn Fn का आकार छोटा है, आपको इसे संदर्भ या स्मार्ट पॉइंटर के पीछे रखना होगा। चूंकि यह वापसी की स्थिति में है, यह एक संदर्भ नहीं हो सकता है, इसलिए Box<dyn Fn(f32) -> f32> वही है जो आप चाहते हैं। (यह में भी शामिल है किताब।)

त्रुटि संदेश काफी गूढ़ है, संभवतः घोषणा में दोष के परिणामस्वरूप Box को Fn(...) को लागू करने से रोकता है, जिसने इसे एक गैर-कार्य बना दिया। दिलचस्प बात यह है कि यदि आप कॉल को पूरी तरह से टिप्पणी करते हैं, तो संकलन FunctionFactoryType की मूल गलत परिभाषा के साथ भी सफल होता है।

6
user4815162342 15 मार्च 2021, 23:30

मुझे लगता है कि समस्या यह है कि आपके फ़ंक्शन का रिटर्न प्रकार Sized नहीं है, उदा। यह सही है:

type FunctionFactoryType<O: Fn(f32) -> f32> = Box<dyn Fn(f32, f32, f32, f32) -> O>;

fn abc<O: Fn(f32) -> f32>(x: FunctionFactoryType<O>) {
    (*x)(1.0, 2.0, 3.0, 4.0);
}

यह लौटाए गए फ़ंक्शन को Box<Fn(f32) -> f32> में डालने का भी काम करता है।

मैं जवाब नहीं दे सकता क्यों यह बताता है कि यह एक फ़ंक्शन एक्सप्रेशन नहीं है।

1
sebpuetz 15 मार्च 2021, 23:30