2009-10-23 7 views
6

Lamdbaj जावा भाषा में बंद की परिभाषा की अनुमति देता है, विभिन्न उदाहरणों hereजावा तंत्र lambdaj बंद में उपयोग में

मेरा प्रश्न, उपयोग में अंतर्निहित जावा तंत्र के बारे में है, उदाहरण के लिए परिभाषित करने के लिए println पाया जा सकता है बंद, निम्नलिखित कोड प्रयोग किया जाता है:

println.apply("foobar"); 
:

Closure println = closure(); 
{ of(System.out).println(var(String.class)); } 

यह बंद बाद में के माध्यम से क्रियान्वित किया जा सकता

मुझे उत्सुकता है कि जावा में कौन से तंत्र of(...).println(...) पर कॉल को println उदाहरण से जुड़े होने की अनुमति देंगे।

स्वाभाविक रूप से, लैम्बडाज स्रोत कोड पढ़ने के लिए उपलब्ध है, लेकिन अगर किसी के पास है तो मैं थोड़ा उच्च स्तर की स्पष्टीकरण की उम्मीद कर रहा था। मेरा प्रतिबिंब कौशल आत्मनिरीक्षण और गतिशील रूप से विधियों को निष्पादित करने तक थोड़ा सा जाता है।

+0

मुझे याद आ रही

http://groups.google.com/group/lambdaj

अलविदा: यदि आप अन्य प्रश्न, अनोखी या यहां तक ​​कि बेहतर सुझाव और रचनात्मक आलोचकों lambdaj के बारे में है, तो हो सकता है आप lambdaj मेलिंग सूची यहाँ करने के लिए अपने आप को रजिस्टर करने के लिए रुचि हो सकती है "बंद" बिट? मैं एक विधि उठा लिया, लेकिन यह है। : -/ –

+1

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

उत्तर

2

खैर, of शायद एक static विधि है जो स्थिर आयात किया जाता है तो यह संलग्नित क्लास नाम के बिना कहा जा सकता है। मुझे उम्मीद है कि var वही है।

public class Printable { 
    public void println(Var var); 
} 

public class Fac { 
    public static Printable of(Object o) { 
    return new Printable(o); 
    } 

    public static Var var(Class<?> clazz) { 
    return new Var(clazz); 
    } 

} 
अचानक

सभी:

Fac.of(System.out).println(Fac.var(String.class)); 

वैध जावा है दोनों ही तरीकों से कुछ प्रकार है जो तरीकों बाद में कहा जाता है लौट जाना चाहिए। स्थिर आयात का उपयोग करना, हे Presto:

import static Fac.*; 

of(System.out).println(var(String.class)); 

घुंघराले-ब्रेसिज़ के रूप में आप किसी भी विधि में इन जोड़ सकते हैं एक शाब्दिक Sope को परिभाषित करने में सहायता करने के लिए स्पष्ट रूप से वैध जावा हैं। इस एपीआई-डिजाइन शैली को fluent कहा जाता है और JMock परीक्षण लाइब्रेरी द्वारा सबसे अच्छा प्रदर्शन किया जाता है।

वैसे, यदि यह जावा को बंद करने के लिए माना जाता है, तो यह काफी हास्यास्पद है - वाक्यविन्यास अपरिहार्य रूप से भयानक है। उनके आई/ओ उदाहरण ने वास्तव में मुझे जोर से हंसते हुए बनाया। स्कैला आज़माएं!

संपादित - दो println कॉल जुड़े रहे हैं क्योंकि मेरा मानना ​​है कि कॉल का पहला अनुक्रम पुस्तकालय चर जो आप पैरामीटर के रूप में में बीत चुके हैं पर कब्जा करने की अनुमति देते हैं। ये शायद ThreadLocal संरचना में कब्जा कर लिया गया है। जब आप एक (संभावित रूप से स्थैतिक) println विधि को कॉल करते हैं, तो लाइब्रेरी इस कैप्चर किए गए डेटा का उपयोग वास्तव में बाद के बिंदु पर व्यवहार को निष्पादित करने के लिए कर रही है। संबंधित परीक्षण भी, EasyMock परीक्षण ढांचे अपेक्षित मानों को कैप्चर करने के लिए एक समान तंत्र (जो पृष्ठभूमि में जावा प्रॉक्सी का उपयोग करता है) का उपयोग करता है।

+3

+1। सी ++ के 3 साल बाद मैंने सोचा कि मुझे बदसूरत बंद होने के बारे में पता था, लेकिन * ईश्वर सर्वशक्तिमान * ... –

+0

धन्यवाद, मैंने वास्तव में अपने अधिकांश सक्रिय विकास के लिए वास्तव में स्कैला में स्विच किया है। यह अभी भी मुझे भ्रमित करता है, हालांकि, मैं स्थिर आयात तत्व को समझता हूं, मेरी पहेली यह है कि कैसे कॉल (...)। Println (...) किसी भी तरह से इसके पहले परिभाषित उदाहरण 'println' से जुड़ा हुआ है, मेरे शुरुआती उदाहरण में । –

+0

ठीक है - मैंने अपना जवाब संपादित कर लिया है क्योंकि मुझे लगता है कि मुझे पता है कि यह शायद कैसे हो रहा है –

10

मैं मारियो फ्यूस्को हूं और मैं लैम्बडाज पुस्तकालय का मुख्य डेवलपर हूं।

सबसे पहले मैं कुछ स्पष्टीकरण देना चाहता हूं: lambdaj किसी भी कार्यात्मक भाषा को प्रतिस्थापित करने का इरादा नहीं है। जैसा कि मैंने पिछले हफ्ते ज्यूरिख के जुग में अपने भाषण में कहा था कि यदि आपके पास स्कैला का उपयोग करने का मौका है, तो इसके लिए जाएं और कभी वापस न देखें।

http://ctpjava.blogspot.com/2009/10/lambdaj-new-trends-in-java.html

मैं एक खुश स्काला डेवलपर भी हूँ: यहाँ आप अपने भाषण की एक फिर से शुरू है, जहां यह स्पष्ट रूप से कहा गया है कि मिल सकता है। लेकिन कभी-कभी आप जावा में विकसित होने के लिए बाध्य हैं (मेरे अनुभव में, वास्तविक दुनिया में, 80% बार आप चुन सकते हैं कि आपको कौन सी भाषा में अपना कोड लिखना है) और इस मामले में कुछ लैम्बडाज सुविधाएं हो सकती हैं सहायक (या मुझे उम्मीद है)। मैं बस जावा को कुछ कार्यात्मक विशेषताओं को लाना चाहता था जो पूरी तरह गायब हैं। बेशक नतीजा मुख्य रूप से जावा द्वारा लगाई गई सीमा के कारण पूरी तरह से संतुष्ट नहीं होता है।

आंतरिक लैम्बडाज तंत्र के लिए, हां यह परिणाम प्राप्त करने के लिए थ्रेडलोकल का उपयोग करता है। मारियो

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