2012-08-13 17 views
13

मैं wth इसस्केला: वापसी कथन के साथ समस्याओं

निम्नलिखित कोड ठीक संकलित एक छोटे से हैरान हूँ:

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    BadRequest(toJson("something went wrong")) 
    } else { 
    Ok(toJson(Feature.find)) 
    } 
} 

लेकिन अगर मैं सिर्फ वापसी कथन जोड़ने के लिए, मैं निम्नलिखित मिल:

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    return BadRequest(toJson("something went wrong")) 
    } else { 
    return Ok(toJson(Feature.find)) 
    } 
} 

[error] found : play.api.mvc.SimpleResult[play.api.libs.json.JsValue] 
[error] required: play.api.mvc.Action[play.api.mvc.AnyContent] 
[error]  return BadRequest(toJson("something went wrong")) 

मुझे लगा कि यह दोनों कोड बराबर होगा ...

Btw, लड़ाई, एक साथी वस्तु है साथ एक लागू विधि जो फ़ॉर्म का कार्य प्राप्त करती है: अनुरोध [AnyContent] => परिणाम, और जो एक कार्य देता है [AnyContent]

यह वापसी विवरण के साथ लगता है, ब्लॉक सीधे BadRequest निष्पादित करने के परिणाम को वापस कर रहा है। .. और ठीक है ... ब्लॉक ऑब्जेक्ट साथी को ब्लॉक पास करने के परिणाम लौटने के बजाय ...

क्या मैं सही हूँ?

नोट: मैं इतने सारे नेस्टेड मानचित्र और getOrElse से छुटकारा

ps हो रही का एक तरीका खोजने की कोशिश कर रहा हूँ: माफ करना अगर सवाल एक छोटे से भ्रमित है, मैं अपने आप को भ्रमित कर रहा हूँ ...

उत्तर

11

ये दो अभिव्यक्ति वास्तव में बहुत अलग चीज़ें करते हैं!

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    BadRequest(toJson("something went wrong")) 
    } else { 
    Ok(toJson(Feature.find)) 
    } 
} 

यहाँ, saveAction(Ok(toJson(Feature.find))) का परिणाम वापस आ जाएगी। अब,

def save: Action[AnyContent] = Action { 
    if (1 == 2) { 
    return BadRequest(toJson("something went wrong")) 
    } else { 
    return Ok(toJson(Feature.find)) 
    } 
} 

यहां स्थिति अधिक जटिल है। जब return Ok(toJson(Feature.find)) का मूल्यांकन किया जाता है, यह save से वापस आ जाएगा! यही है, Ok(toJson(Feature.find))Action पर पारित किया जाएगा। इसके बजाए, विधि save का निष्पादन बंद हो जाएगा और Ok(toJson(Feature.find)) इसके परिणाम के रूप में वापस कर दिया जाएगा - सिवाय इसके कि यह save प्रकार वापस नहीं होना चाहिए, इसलिए यह एक प्रकार की त्रुटि देता है।

याद रखें: return संलग्न def से वापस आता है।

+0

धन्यवाद डैनियल, मैंने पाया कि आपने कड़ी मेहनत क्यों की है ... क्या एक समारोह से बिना शर्त निकास करने का कोई तरीका है? यानी, मैं चाहता हूं कि कार्रवाई में पारित होने वाले ब्लॉक में वापसी का मूल्यांकन किया जाए ... – opensas

+2

@ ओपेन्सस आप हमेशा अपने फ़ंक्शन को 'def' के रूप में परिभाषित कर सकते हैं, और उसके बाद इसे' एक्शन 'के पैरामीटर के रूप में पास कर सकते हैं। –

+0

** याद रखें: संलग्न डीफ़ से रिटर्न रिटर्न ** क्या आप कृपया इसका अर्थ बता सकते हैं? –

4

विधि आप का उपयोग वास्तव में Action साथी वस्तु में परिभाषित किया गया है, लेकिन यह एक आप अपने प्रश्न में वर्णन है, बल्कि नहीं है:

def apply (block: ⇒ Result): Action[AnyContent] 

तर्क (block) प्रकार परिणाम की अभिव्यक्ति, कि होता है लैट का मूल्यांकन किया जाना चाहिए मांग पर ईआर (नाम से मूल्यांकन)। यह एक समारोह या बंद नहीं है, सिर्फ एक अभिव्यक्ति है। तो आप एक अभिव्यक्ति से return नहीं कर सकते हैं।

बीटीडब्ल्यू: स्कैला में return का उपयोग कोड कोड गंध है, और इससे बचा जाना चाहिए।

+0

मुझे कार्यों और अभिव्यक्तियों के बीच अंतर के बारे में कोई जानकारी नहीं थी, मैं इसके लिए Google ... बीटीडब्लू, शायद आप इस प्रश्न के साथ मेरी मदद कर सकते हैं, यही सब कुछ शुरू हुआ: http://stackoverflow.com/ प्रश्न/11929235/स्कैला-शैली-कैसे-से-बचने वाले-बहुत-से-नेस्टेड-मानचित्र – opensas

+1

@ ओपेन्सस आपको जिस अंतर को देखना चाहिए वह "फ़ंक्शन" बनाम "कॉल-बाय-नाम तर्क" है। एक कॉल-बाय-नाम '=> 'से शुरू होता है। – paradigmatic

+2

@paradigmatic तो आप जो कह रहे हैं वह है कि 'वापसी' के लिए 'एक्शन' द्वारा अपेक्षित प्रकार के बजाय 'विधि' (विधि 'एक्शन' एक्शन 'एक्शन [एनीकंटेंट]' विधि के प्रकार के मूल्य की आवश्यकता होती है। (जो 'परिणाम' टाइप है, या संकलक के रूप में 'SimpleResult') की सूचना दी गई है। या, दूसरे शब्दों में, "आप अभिव्यक्ति से 'वापसी' नहीं कर सकते हैं, लेकिन आप एक विधि से वापस (और संकलक करने की कोशिश कर सकते हैं) कर सकते हैं। समझ में आता है, धन्यवाद। –

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