मैं स्काला में एक चर कैसे डालूं?


199

प्रकार के साथ एक चर को देखते हुए Graphics, मैं इसे Graphics2Dस्काला में कैसे डालूं?

जवाबों:


282

पसंदीदा तकनीक पैटर्न मिलान का उपयोग करना है। यह आपको इनायत से इस मामले को संभालने की अनुमति देता है कि विचाराधीन मूल्य दिए गए प्रकार का नहीं है:

g match {
  case g2: Graphics2D => g2
  case _ => throw new ClassCastException
}

यह ब्लॉक asInstanceOf[Graphics2D]विधि के शब्दार्थ को दोहराता है , लेकिन अधिक लचीलेपन के साथ। उदाहरण के लिए, आप एक ही समय में कई सशर्त जातियों को प्रभावी ढंग से निष्पादित करते हुए, विभिन्न प्रकारों के लिए विभिन्न शाखाएं प्रदान कर सकते हैं। अंत में, आपको वास्तव में कैच-ऑल क्षेत्र में एक अपवाद को फेंकने की आवश्यकता नहीं है , आप वापस भी लौट सकते हैं null(या अधिमानतः None), या आप कुछ कमबैक शाखा में प्रवेश कर सकते हैं जो बिना काम करता है Graphics2D

संक्षेप में, यह वास्तव में जाने का रास्ता है। यह थोड़ा अधिक वाक्यात्मक रूप से भारी है asInstanceOf, लेकिन जोड़ा लचीलापन लगभग हमेशा इसके लायक है।


19
+1 क्योंकि यह दिलचस्प है, लेकिन इस परिदृश्य के लिए बहुत अधिक है। है ना?
यूजीन योकोटा

क्या होगा यदि मैं पहले से ही जातिगत मूल्य के प्रतिमान को खो चुका हूँ, लेकिन खोया हुआ मान: <code> base match {case MyConcrete (value) => base.asInstanceOf [MyConcrete] .something (मान) </ code>, 'पाने का एक तरीका है। आधार 'MyConcrete (मान) "द्वारा निष्पादित' अनपेक्षित 'कॉल का उपयोग करके" मान "निकालना चाहते हैं, तो भी आधार' MyConcrete 'को दिया गया है?
ithkuil

4
इसे आज़माएँ: base match { case base @ MyConcrete(value) => base.something(value) } जाहिर है, शैडोइंग baseवैकल्पिक है। आप आसानी से एक भिन्न चर नाम का उपयोग कर सकते हैं।
डैनियल स्पाइवाक

जो मुझे नहीं मिलता वह यह है कि इस पैटर्न के परिणाम को एक चर में कैसे मिलाया जाएगा? जैसे जावा में अगर यह स्ट्रिंग a = (स्ट्रिंग) b था; स्काला क्या होगा?
जेम्स मैकमोहन

@JamesMcMahonval gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
केविन मेरेडिथ

224
g.asInstanceOf[Graphics2D];

36
एक बार जब मैं स्काला के लिए अभ्यस्त हो गया, तो मैंने उपयोग नहीं करना सीखा asInstanceOf, क्योंकि यह स्थैतिक प्रकार की प्रणाली के उद्देश्य को हरा देता है और yucky लगता है।
यूजीन योकोटा

26
दुर्भाग्य से, स्विंग का उपयोग करते समय यह एक सामान्य ऑपरेशन है। कस्टम पेंटिंग ऑपरेशंस के लिए, आपको 'public void paintComponent (Graphics g)' विधि को ओवरराइड करना होगा। ग्राफिक्स पैरामीटर वास्तव में एक ग्राफिक्स 2 डी उदाहरण है, लेकिन एक कास्ट की जरूरत है। पैटर्न मिलान संस्करण शायद वारंटेड की तुलना में अधिक वाचालता है। याद रखें: मोहक अतिसक्रियता और अतिशयोक्ति को दूर करता है!
होहोनौली

7
@ ह्होनौली मुझे लगता है कि कलाकार उस विशिष्ट मामले में ठीक है, लेकिन अगर आप scala-swingघटकों का उपयोग करते हैं, तो पेंटकम्पोनेंट का पैरामीटर पहले से ही ग्राफिक्स 2 डी है, इसलिए किसी भी कलाकार की आवश्यकता नहीं है
लुइगी प्लिंज

2
इतनी देर क्यों? क्यों "asInstanceOf जब केवल" as "या" asof "कीवर्ड या विधि हो सकती है? या उन्होंने केवल C ++ और Java तरीके को एक विकल्प के रूप में क्यों नहीं अपनाया क्योंकि यह पारंपरिक है और इसके साथ कोई बड़ी समस्या नहीं है?
LEMUEL ADANE

16
@LemuelAdane तथ्य यह है कि आप सभी कास्ट का उपयोग कर रहे हैं एक कोड गंध है, यह उन्हें आसान बनाने के लिए कोई मतलब नहीं है।
डेन्थ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.