2011-08-31 14 views
5

मैं स्कैला और जेडीबीसी का उपयोग करता हूं, अब मैं एक बहु-सम्मिलन करने के लिए PreparedStatement का पुन: उपयोग करना चाहता हूं। मैं एक सरणी पर एक foreach-loop का उपयोग करना चाहता हूँ, लेकिन मैं इसे स्कैला के साथ सही नहीं कर सकता।स्कैला में फ़ोरैच-लूप का उपयोग कैसे करें जो ऑब्जेक्ट को म्यूट करता है?

val stmt = conn.prepareStatement(insertStatement) 

// wrong Scala 
items.foreach(item : MyItem => 
    stmt.setInt(1, item.id) 
    stmt.setInt(2, item.value) 
    stmt.executeUpdate() 
    ) 

items कई MyItem युक्त एक सरणी है।

मैं स्कैला में इस फ़ोरैच-लूप को कैसे लिख सकता हूं और PreparedStatement का पुन: उपयोग कर सकता हूं?

+0

यह सिर्फ हो सकता है कि आप ठीक ढंग से निष्पादित करने के लिए बहु-लाइन ब्लॉक पाने के लिए क्रम में घुंघराले ब्रेसिज़ ('आइटम foreach {...}') उपयोग करने की आवश्यकता? यदि नहीं, तो कृपया बताएं ** क्यों ** यह गलत है (उदा। संकलक त्रुटि संदेश, या परिणामस्वरूप गलत व्यवहार दें)। –

+0

@Andrzej: मैंने कुछ स्थानों में '{' और '} 'डालने का प्रयास किया है, लेकिन मैं इसे किसी भी संयोजन से संकलित नहीं कर सकता। इस मामले में त्रुटि 'उठाई गई त्रुटि है:') 'अपेक्षित लेकिन' ('found.' * * * stmt.setInt ↓ (1, item.id) ' – Jonas

+0

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

उत्तर

19

आप आप इसे एक बहु बयान ब्लॉक (जो आप करते हैं) के रूप में व्याख्या की जा करना चाहते हैं foreach के तर्क के लिए घुंघराले ब्रेसिज़ का उपयोग करने की जरूरत है।

इसके अलावा, आप जो कर रहे हैं वह ठीक दिखता है।

scala> val sb = new java.lang.StringBuilder 
sb: java.lang.StringBuilder = 

scala> val items = List("tinker", "tailor", "soldier", "spy") 
items: List[java.lang.String] = List(tinker, tailor, soldier, spy) 

scala> items.foreach { item => 
    | sb.append(item) 
    | sb.append("; ") 
    | println(sb) 
    | } 
tinker; 
tinker; tailor; 
tinker; tailor; soldier; 
tinker; tailor; soldier; spy; 

(foreach ब्लॉक के लिए और का उपयोग कर कोष्ठक त्रुटि <console>:3: error: ')' expected but '.' found. की ओर जाता है): यहां एक आरईपीएल सत्र जहां मैं एक समान तरीके से एक foreach ब्लॉक में एक वस्तु परिवर्तनशील रहा हूँ (सादगी के लिए एक StringBuilder का उपयोग) है आम तौर पर

val sb = new java.lang.StringBuilder 

val items = List("tinker", "tailor", "soldier", "spy") 

items foreach { item => 
    sb append item 
    sb append "; " 
    println(sb) 
} 

, यह संग्रह के संचालन जैसे map, 012 के लिए इन्फ़िक्स फार्म का उपयोग करने के लिए और अधिक मुहावरेदार माना जाता है:

+0

@biesczadka मुझे यकीन नहीं है कि मैं अनुसरण करता हूं: यदि आप इसे किसी फ़ंक्शन से वापस करना चाहते हैं, तो बस सुनिश्चित करें कि यह आपके फ़ंक्शन का रिटर्न वैल्यू है! किसी भी तरह से, इस प्रश्न या मेरे उत्तर के साथ ** ** कुछ भी नहीं है, इसलिए यदि आपको अभी भी समस्याएं हैं तो आपको इसे एक अलग प्रश्न के रूप में पोस्ट करना चाहिए। –

11

एक छोटा सा बिंदु है, लेकिन Andrzej का जवाब ऊपर बड़ी उदारतापूर्वक इन्फ़िक्स संकेतन का उपयोग करके साफ किया जा सकता, foreach और filter

+3

यह टिप्पणी मुझे आश्चर्यचकित करती है। स्टाइल गाइड में चर्चा यहां दी गई है: http://davetron5000.github.com/scala-style/method_invocation/arity1/index.html और http://davetron5000.github.com/scala-style/method_invocation/arity1/higher_order_functions। एचटीएमएल नियम ऐसा प्रतीत होता है कि इन्फिक्स नोटेशन * केवल * अपरिवर्तनीय कार्यों के लिए उपयोग किया जाना चाहिए, और अधिमानतः उच्च मानचित्र विधियों जैसे 'map' के साथ। चूंकि 'एपेंड' एक उत्परिवर्तन है, स्टाइल गाइड कहता है कि इंफिक्स का उपयोग न करें। –

+1

शैली मार्गदर्शिका सिर्फ यही है, एक * गाइड *। इसमें दिशानिर्देश हैं (नियम नहीं) और यह पूर्ण सुसमाचार नहीं है।आपको इनमें से कुछ सुझावों पर मतभेद मिलेगा, जिनमें से एक भी शामिल है :) –

+1

नियम के लिए एक स्पष्ट प्रति-उदाहरण के रूप में, असाइनमेंट विधि, '=', साइड-इफेक्टिंग है, लेकिन हमेशा इंफिक्स नोटेशन में उपयोग की जाती है। –

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

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