2013-09-25 12 views
18

मुझे जो कुछ पता है, उसके विशिष्ट जवाब खोजने में मुझे कठिनाई हो रही है। मैं समझना चाहता हूं कि स्कैला में ब्लॉक कैसे काम करते हैं। मैं एक जावा/रूबी पृष्ठभूमि से आया हूं और ऐसा लगता है कि स्कैला के ब्लॉक का उपयोग करने का एक बिल्कुल अलग तरीका है।स्कैला ब्लॉक को समझना

निम्नलिखित कोड Play! Framework website से है। मैं समझना चाहता हूं कि एक्शन अर्थात् है। क्या यह एक ऑब्जेक्ट या फ़ंक्शन है जो ब्लॉक को स्वीकार करता है, या शायद न तो।

object Application extends Controller { 

    def index = Action { 
    Ok(views.html.index("Your new application is ready.")) 
    } 

} 

यदि यह एक समारोह है, शायद इसके लिए वाक्यात्मक चीनी है निम्नलिखित (इस स्थिति में कैसे स्केला पर्दे के पीछे ब्लॉक के आसपास पारित करता है):

def index = Action({ 
    Ok(views.html.index("Your new application is ready.")) 
    }) 

या यह कुछ स्केला वाक्य रचना मैं है मैं अनजान हूँ।

स्कैला स्रोत कोड के किसी भी संदर्भ से मुझे यह समझने में मदद मिलेगी कि यह दृश्यों के पीछे कैसे काम कर रहा है।

उत्तर

21

रूबी ब्लॉक के बजाए जावा अज्ञात वर्गों (जैसे गुवा फ़ंक्शन) के रूप में स्कैला ब्लॉक के बारे में सोचना बेहतर होगा। असल में बात कर रहा है, अगर आप स्केला कोड डिकंपाइल आप कम या ज्यादा एक ही कोड (taken from Guava examples) देखेंगे:

Function<String, Integer> lengthFunction = new Function<String, Integer>() { 
    public Integer apply(String string) { 
    return string.length(); 
    } 
}; 

अंतर यह है कि स्केला वाक्य रचना चीनी का एक बहुत प्रदान करता है और आप के रूप में कोड के ऊपर लिखने के लिए अनुमति देता है:

val lengthFunction = { string: String => string.length } 

एक विशिष्ट कार्रवाई उदाहरण के लिए के रूप में:

def index = Action({ 
    Ok(views.html.index("Your new application is ready.")) 
    }) 

यहाँ कार्रवाई विधि लागू के साथ होने की संभावना वस्तु है। एक अन्य स्कैला चीनी: भाषा आपको Foo(bar) लिखने और Foo.apply(bar) लिखने की अनुमति देती है।

def index = Action({ 
    Ok(views.html.index("Your new application is ready.")) 
}) 

और एक हस्ताक्षर के रूप में कुछ इस तरह है::

object Action { 
    def apply(block: => Result) = ??? 
} 

जैसा कि पहले ही @yan से कहा, यह स्केला है इसके बाद, you can drop round braces when your call isn't ambiguous, तो हाँ, यह वास्तव में एक विधि इस तरह बुला लिया गया है जिस तरह से कहने के लिए हे, मैं एक समारोह है कि एक और समारोह है कि पैदा करता है स्वीकार परिणाम

Desugared मंगलाचरण

की तरह दिखाई देगा
def index = Action.apply(new AbstractFunction[Result] { 
     def apply() = Ok.apply(views.html.index.apply("...")) 
}) 
8

यहां कुछ चीजें चल रही हैं। Action एक ऐसी वस्तु है जो apply() विधि लागू करती है, जब आप ऑब्जेक्ट को फ़ंक्शन के रूप में देखते हैं तो क्या कहा जाता है। कुछ apply()implementations हैं। पहला कार्यान्वयन एक उप-नाम पैरामीटर का उपयोग करता है।

स्कैला 'उप-नाम पैरामीटर' के रूप में जाने वाली अवधारणा का समर्थन करता है, जो सामान्य मानकों की तरह हैं, सिवाय इसके कि उनका मूल्यांकन केवल तभी किया जाता है जब कोड का संदर्भ दिया जाता है। वे संरचनाएं बनाने में मदद करते हैं जो प्रकट होते हैं जैसे वे मैक्रोज़ का उपयोग किए बिना भाषा का हिस्सा हैं। इस मामले में, Ok(..) के आसपास का ब्लॉक केवल बयान के नियमित ब्लॉक है, जिसमें अंतिम व्यक्ति का मूल्य ब्लॉक के मूल्य के रूप में उपयोग किया जा रहा है। आपके द्वारा प्रदान किया गया उदाहरण ब्रेसिज़ के बिना भी काम करेगा। आप अनिवार्य रूप से ओके की apply विधि Action की apply विधि के परिणाम को पारित कर रहे हैं।

apply() का दूसरा संस्करण वास्तव में एक पूर्ण अज्ञात फ़ंक्शन लेता है जो परिणाम के लिए अनुरोध करता है। इस मामले में, आप एक अनाम (या नामित) फ़ंक्शन पास कर सकते हैं।

+0

उत्तर के लिए धन्यवाद। तो जो मैं इकट्ठा कर रहा हूं, यह action.apply() के लिए सिंथेटिक चीनी है। चीनी को हटाने, पूरा बयान कैसा दिखता है? – b1nd

+0

आपके पास यह बयान अनिवार्य रूप से 'Action.apply (ठीक है .apply (views.html। इंडेक्स (" आपका नया एप्लिकेशन तैयार है। "))। यदि आप प्रदान किए गए यूआरएल में 'लागू() 'की परिभाषा को देखते हैं, तो आप पैरामीटर के प्रकार से पहले एक तीर देखेंगे। यह सिर्फ ऊपर वर्णित 'उप-नाम' पैरामीटर को चिह्नित करता है। (साथ ही, यह कोई संयोग नहीं है कि नाम के लिए वाक्यविन्यास बिना किसी तर्क के अज्ञात फ़ंक्शन की तरह दिखता है) – yan

+0

डॉक खेलने के लिए लिंक रास्ते से टूटा हुआ है। कभी-कभी, एसओ पार्सर लिंक को गड़बड़ करता है जिसमें डॉलर का चिह्न होता है। –

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