2012-04-01 6 views
5

मैं पहले से ही पढ़ा है कि स्केला में अगर बयान हमेशास्केला विकल्प के साथ समस्याएं हो नौसिखिया, त्रिगुट ऑपरेटर

तो मैं निम्नलिखित (छद्म कोड) करने के लिए कोशिश कर रहा हूँ एक अभिव्यक्ति देता है के बराबर

क्या
sql = "select * from xx" + iif(order.isDefined, "order by " order.get, "") 

मैं

val sql: String = "select * from xx" + if (order.isDefined) {" order by " + order.get} else {""} 

साथ कोशिश कर रहा हूँ लेकिन मैं इस त्रुटि मिलती है:

illegal start of simple expression 

आदेश एक विकल्प है [स्ट्रिंग]

मैं सिर्फ एक विधि के लिए एक वैकल्पिक पैरामीटर करना चाहते हैं, और यदि उस पैरामीटर (इस मामले क्रम में) तो पास नहीं की जाएगी बस इसे

को छोड़ क्या होगा मैं जो करने की कोशिश कर रहा हूं उसे हासिल करने का सबसे बेवकूफ तरीका बनो?

- संपादन -

मुझे लगता है मैं

मैं इस तरह से पाया पूछने के लिए बहुत ज्यादा जल्दबाजी,

val orderBy = order.map(" order by " + _).getOrElse("") 

इस यह करने के लिए सही तरीका है?

मैंने सोचा था कि नक्शा अन्य प्रयोजनों के लिए चाहिए था ...

+2

आपका कोड संकलित नहीं कर रहा है क्योंकि आपको ' अगर अभिव्यक्ति। लेकिन जैसा कि टॉमसज़ नर्कविचज़ बताते हैं, वैसे भी इसे लिखने के बेहतर तरीके हैं। –

+1

कोई भी टिप्पणी करना चाहता है * क्यों * हमें if-expression के चारों ओर ब्रैकेट की आवश्यकता है ("यह संकलित करता है" के अलावा)? –

+1

@ लुइगीप्लिंग यह सिर्फ अटकलें है, लेकिन हो सकता है कि वे प्रोग्रामर भ्रम से बचें, क्योंकि '1 + अगर (बी) 2 अन्य 3 + 4' जैसी अभिव्यक्ति कैसे संबद्ध होगी। क्या यह '1 + है (यदि (बी) 2 और 3) + 4' या' 1 + (यदि (बी) 2 और 3 + 4) '? निश्चित रूप से आप एक व्याकरण प्राप्त कर सकते हैं जो इस अस्पष्टता को हल करता है (हास्केल करता है), लेकिन इसका मतलब यह नहीं है कि लोग गलतियां नहीं करेंगे क्योंकि उन्होंने एक अलग व्यवहार माना है। –

उत्तर

11

तुम सब मुहावरे Option[T] उपयोग नहीं कर रहे सबसे पहले, इस प्रयास करें: या

"select * from xx" + order.map(" order by " + _).getOrElse("") 

अलग वाक्य रचना के साथ:

"select * from xx" + (order map {" order by " + _} getOrElse "") 

जो लगभग बराबर है:

"select * from xx" + order match { 
    case Some(o) => " order by " + o 
    case None => "" 
} 

scala.Option Cheat Sheet पर एक नज़र डालें। लेकिन क्या तुम सच में if रों (if आसपास लापता कोष्ठकों) की बदसूरत रास्ता तय करना चाहते हैं:

"select * from xx" + (if(order.isDefined) {" order by " + order.get} else {""}) 
+0

बहुत धन्यवाद, टॉमसज़, मैंने इसे अभी Google पर पाया ... और हाँ, मैं स्कैला के साथ काम करने के लिए सबसे बेवकूफ तरीका सीखने की कोशिश कर रहा हूं ... – opensas

0

... या, यदि आप वास्तव में अपने दोस्तों को प्रभावित करना चाहते हैं:

order.foldLeft ("") ((_,b)=>"order by " + b) 

(मैं अभी भी टॉमस के जवाब की सिफारिश करेगा, लेकिन मुझे लगता है कि यह स्केल में शामिल नहीं है। विकल्प धोखा शीट, इसलिए मैंने सोचा कि मैं इसका उल्लेख करूंगा)

+1

यदि आप जा रहे हैं गुना, क्यों प्रारंभिक मान के रूप में उपसर्ग का उपयोग नहीं करते हैं, और पूरी चीज एक ही समय में करते हैं? 'val sql = order.foldLeft (" xx से * चुनें ") ((_, b) =>" द्वारा क्रमबद्ध करें "+ बी)' –

+0

@AndrzejDoyle आप सही हैं, यह करने का एक तरीका है ... मैं था इसे एक बड़े गतिशील रूप से निर्मित क्वेरी का हिस्सा बनने के लिए कल्पना करना जहां आपके पास एक ऐसा फ़ंक्शन है जो केवल "ऑर्डर बाय" भाग बनाता है, दूसरा "जो" खंड बनाता है और आप उन्हें अंत में एक साथ रख देते हैं –