2010-02-05 11 views
22

ऐसा लगता है जैसे कि मैं COMP में Integer.parseInt पहुंचने में समस्याएं आ रहा हूँ। मैं इसे सामान्य रूप से इस तरह उपयोग कर सकते हैं:क्लोजर में कंप करने के लिए मैं एक स्थिर विधि कैसे पास करूं?

user=> (Integer/parseInt "123") 
123 

लेकिन अगर मैं यह COMP में डाल दिया, मैं एक त्रुटि मिलती है:

user=> (def vect-to-int (comp Integer/parseInt (partial apply str))) 
java.lang.Exception: Unable to find static field: parseInt in class java.lang.Integer (NO_SOURCE_FILE:3) 

ऐसा लगता है कि यह जब यह पूर्णांक पर एक क्षेत्र खोजने की कोशिश कर रहा है मेरे लिए लग रहा है एक विधि की तलाश करनी चाहिए। मैं इस तरह Integer.parseInt का उपयोग कैसे कर सकता हूं? और वहाँ एक बेहतर तरीका एक int में वर्ण का एक वेक्टर कन्वर्ट करने के लिए है?

उत्तर

26

क्लोजर फ़ंक्शन जावा विधियां हैं लेकिन जावा विधियां क्लोजर फ़ंक्शंस नहीं हैं उदाहरण के लिए क्लोजर फ़ंक्शंस में मेटा-डेटा और ऐसे हैं। यदि आप एक जावा विधि का उपयोग करना चाहते हैं जहां क्लोजर फ़ंक्शन के लिए कॉल किया गया है तो आपके पास इसे लपेटने में दो विकल्प हैं, memfn और fun or #() memfn एक अप्रचलित फ़ंक्शन है जो क्लोजर फ़ंक्शन में जावा विधि को लपेटता है (यह जानना अच्छा है कि यह मौजूद है भले ही इसका इस्तेमाल अक्सर नहीं किया जाता है)। जावा तरीकों लपेट के लिए आम तौर पर स्वीकार तरीका है:

#(. instance method arg1 argN) 

या स्थिर तरीकों

#(Class/MethodName arg1 argN) 
+0

के लिए मुझे लगता है कि पहली पंक्ति पूर्णतया सत्य है, हालांकि यह वास्तव में :) भर में बिंदु हो जाता है नहीं है –

7
(def vec-to-int (comp #(Integer/parseInt %) (partial apply str))) 

या

(def vec-to-int #(Integer/parseInt (apply str %))) 

partial और comp आमतौर पर #() का उपयोग कर एक गुमनाम fn बनाने के लिए के रूप में Clojure में के रूप में संक्षिप्त नहीं हैं। व्यक्तिगत तौर पर मैं इसे इस तरह लिखना चाहते हैं:

(defn vec-to-int [x] (Integer/parseInt (apply str x))) 

आप सादे def साथ ऐसा कर सकते हैं, लेकिन आप defdefn के बजाय का उपयोग कर क्या हासिल करते हैं, वास्तव में? def का उपयोग इस तथ्य को अस्पष्ट करता है कि आप एक फ़ंक्शन को परिभाषित कर रहे हैं। defn आपके लिए अतिरिक्त मेटाडाटा भी सेट करता है (arglists) कि def नहीं है।

(def vec-to-int #(bigint (apply str %))) 

और फिर भी अधिक सामान्य:

किसी भी मामले में, यह एक अधिक सामान्य तरीका है कि आप क्या कर रहे हैं करने के लिए है

(def vec-to-int #(read-string (apply str %))) 

निर्भर करता है कि क्या आप को संभालने के लिए सक्षम होना चाहते हैं इंटीग्रर्स के अलावा अन्य चीजें।

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