2013-11-14 8 views
7

क्लोजर में "थ्रेडिंग मैक्रोज़" -> और ->> है। मैं बहुत यकीन है कि एक समान निर्माण स्काला कोड में इस्तेमाल किया जा सकता है जैसे कोड को बदलने के लिए कर रहा हूँ:क्लोजर के थ्रेडिंग मैक्रोज़ के बराबर स्कैला क्या है?

var myObj = MyObject(x, y, z) 
myObj = transform(myObj, abc) 
myObj = transformMore(myObj, def) 
myObj = transformYetMore(myObj, bar) 

मैं अगर यह अच्छा लग रहा है देखने के लिए एक काम के माध्यम से उदाहरण देखने के लिए अच्छा लगेगा। मुझे पूरा यकीन है कि आपको स्कैला मामले में मैक्रोज़ का उपयोग करने की आवश्यकता नहीं है।

+0

आप क्रमशः रचना andthen की तरह कुछ मतलब है:

यहाँ इस लक्ष्य को हासिल करने के लिए Functions उपयोगिता है? –

+0

एफ # पाइप अभी भी मेरा पसंदीदा :) – Alex

उत्तर

2

अच्छा प्रश्न! मैं कई उदाहरणों के बारे में सोच सकता हूं जहां ऐसा कुछ आसान हो सकता है। एक उदाहरण देने के लिए, मैं एक डाटासेट के साथ काम कर रहा हूँ और मैं जबकि इस तरह आगे परिणाम को ले जाने के लिए उस पर कई कार्य लागू करना चाहते हैं:

val result: ResultSet = Functions.thread(inputSet) 
           .andThen(execute(_, executionContext)) 
           .andThen(_.filter(_.nonEmpty)) 
           .andThen(verifyData(_, verificationHelper)) 
           .andThen(_.cache) 
           .andThen(saveSnapshot) 

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

object Functions { 
    def thread[T](item: T) = new ThreadFunctor(item) 
} 

class ThreadFunctor[T](val item: T) { 
    def andThen(f: T => T): ThreadFunctor[T] = new ThreadFunctor(f(item)) 
} 

object ThreadFunctor { 
    implicit def threadToItem[T](thread: ThreadFunctor[T]): T = thread.item 
} 
0

क्लोजर में थ्रेडिंग मैक्रोज़ का उपयोग अत्यधिक घोंसले वाले अभिव्यक्तियों की समस्या को हल करने के लिए किया जाता है, इस प्रकार स्काला में किसी प्रकार की थ्रेडिंग यूटिलिटीज का उपयोग करने के लिए बहुत असामान्य है (हालांकि सिद्धांत में यह संभव है, स्टीफन का उल्लेख है) क्योंकि सामान्य संग्रह कार्य ठीक हैं

def square(x: Int) = x * x 
def plusOne(x: Int) = x + 1 
List(1,2,3,4).map(square).map(plusOne) 

या भी लंबा लोगों को:

someCollection.map(...) 
       .flatMap(...) 
       .filter(...) 
       .map(...) 
       ... 

अन्य वैकल्पिक समझ (और अधिक उपयोगी विकल्प और वायदा के लिए) के लिए है। यदि आप इससे खुश नहीं हैं, तो आपको मैक्रोज़ का उपयोग करने की आवश्यकता नहीं है, ऐसे संरचनाओं पर कई ब्लॉग पोस्ट हैं, उदाहरण के लिए this one

+4

मुझे सच में नहीं लगता कि यह असामान्य है, खासकर कार्यात्मक कोड में; आपका पहला उदाहरण मैं वास्तव में 'सूची (1,2,3,4)। मैप (वर्ग और फिर प्लसऑन)' के रूप में देखने की उम्मीद करता हूं। यह आपके द्वारा बुलाए जाने वाले मोनैडिक केस के साथ और भी सत्य है; 'समझ के लिए' की बजाय कि एक चर के माध्यम से बस मुझे क्लेस्ली संरचना देखना होगा। – Hugh

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