कोड आपके द्वारा दिया गया स्निपेट ब्लॉक घोषणा नहीं है: यह एक ब्लॉक घोषणा और एक ब्लॉक परिभाषा है। सबसे पहले, आप एक पहचानकर्ता aBlock
नामित घोषित:
^(BOOL param) { ...
इन दोनों पार्स और अलग से मूल्यांकन कर रहे हैं:
int (^aBlock)(BOOL)
तो आप एक ब्लॉक परिभाषित करते हैं। चूंकि आप एक दूसरे को असाइन कर रहे हैं, इसलिए कंपाइलर यह सुनिश्चित करने के लिए एक प्रकार-चेक करता है कि बाईं ओर की अभिव्यक्ति (आपकी aBlock
घोषणा) दाएं हाथ की ओर अभिव्यक्ति के समान प्रकार है (ब्लॉक परिभाषा) ।
तो, जवाब है, इन भागों को अलग से मूल्यांकन करने की आवश्यकता है। चूंकि ब्लॉक परिभाषा को स्वयं संकलित किया जा रहा है, इसलिए आपको param
का प्रकार शामिल करना होगा, अन्यथा संकलक को यह नहीं पता होगा कि यह किस प्रकार होना चाहिए। (हाँ, आप इस मामले में एक अपवाद बना सकते हैं, और काम भर में देखने के लिए है, लेकिन अन्य सभी स्थानों सी भाषा में आप एक प्रकार पहली देकर एक पहचानकर्ता घोषित, तो क्यों इसे दूसरे तरीके से यहां करते हैं?)
लेकिन - आप कह सकते हैं - यदि यह सच है तो मुझे दाएं हाथ पर रिटर्न प्रकार (int
) को परिभाषित क्यों नहीं किया गया है?
आप का बहुत अजीब। जवाब यह है कि, जब ब्लॉक अभिव्यक्ति लिखते हैं, तो आपको रिटर्न प्रकार को परिभाषित करने की आवश्यकता नहीं होती है, क्योंकि संकलक ब्लॉक के अंदर रिटर्न स्टेटमेंट (या इसकी कमी) से इसका अनुमान लगा सकता है।
(तो क्यों आप समारोह परिभाषा के साथ वापसी प्रकार में शामिल करना है? ठीक है, इतिहास, मुझे लगता है। प्रोग्रामिंग भाषा परिभाषाओं अपूर्ण मनुष्यों द्वारा बनाये गये थे।)
हाँ, यह कमाल है, धन्यवाद। बस स्पष्ट करने के लिए, क्या आपका दूसरा कोड कोड टाइपिंग जानकारी (और इसलिए फहरा हुआ) के हस्तांतरण का एक उदाहरण है? – chm
नहीं, मैं बस यह दिखा रहा हूं कि बाएं हाथ और दाएं हाथ के बीच के प्रकार अलग-अलग हो सकते हैं, और कोड संकलित और चलाएगा। जहां तक मैं वास्तव में बता सकता हूं, रिटर्न प्रकारों के अलावा अन्य ब्लॉक के साथ बहुत से प्रकार की जांच नहीं कर रही है। टाइपिंग जानकारी का कोई हस्तांतरण नहीं है क्योंकि यह वास्तव में एक चीज नहीं है, मैंने वाक्यांश दिया कि थोड़ा अजीब, मैं यह कहने की कोशिश कर रहा था कि संकलक ने ऐसा कुछ करने की कोशिश की है, लेकिन यह आवश्यक नहीं होगा, क्योंकि वहां ब्लॉकों की कुछ पॉलिमॉर्फिक विशेषताएं जो इस तरह की सुविधा में हस्तक्षेप करती हैं। –