2010-05-05 12 views
5

मेरे पास एक गणना है कि मैं एक अभिनेता में पैटर्न मैचों में उपयोग करना चाहता हूं। मुझे वह उम्मीद नहीं मिल रही है जो मैं उम्मीद करता हूं और अब, मुझे संदेह है कि मुझे कुछ आसान याद आ रहा है।स्कैला मैच/गणना की तुलना

मेरे गणन,

object Ops extends Enumeration { 
    val Create = Value("create") 
    val Delete = Value("delete") 
} 

फिर, मैं एक स्ट्रिंग से एक ऑप्स बनाएँ:

val op = Ops.valueOf("create") 

मेरी मैच के अंदर, मेरे पास है:

case (Ops.Create, ...) 

लेकिन Ops.Create नहीं करता है जैसा दिखता है ops.valueOf ("create")

पूर्व सिर्फ एक परमाणु 'बनाने' है और बाद में कुछ (बनाने)

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

धन्यवाद है

उत्तर

7

तुम सिर्फ Create की एक प्रति प्राप्त करने के लिए कोशिश कर रहे हैं, तो आप इसे करने के लिए अपने कोड में सीधे उल्लेख करना चाहिए:

val op = Ops.Create 

लेकिन अगर आप यह एक स्ट्रिंग से पार्स करने कर रहे हैं, स्ट्रिंग कबाड़ शामिल हो सकता है, इसलिए valueOf रिटर्न एक Option:

val op1 = Ops.valueOf("create") // Some(Ops.Create) 
val op2 = Ops.valueOf("delete") // Some(Ops.Delete) 
val op3 = Ops.valueOf("aljeaw") // None 

अब, अपने मैच में तुम सिर्फ Option[Ops.Value] साथ ले जाने के लिए और देखने के लिए कर सकते हैं:

case(Some(Ops.Create),...) 

और आपके पास इनपुट के रूप में जंक में अंतर्निहित मजबूती है।

+0

खतरनाक रूप से सहायक प्रतिक्रिया, धन्यवाद रेक्स! – Tim

+7

भविष्य में इसे पढ़ने वाले किसी भी व्यक्ति के लिए, 'Enumeration.valueOf' को बहिष्कृत कर दिया गया है: इसके बजाय' नाम 'के साथ उपयोग करें –

1

Enumeration.valueOfNone या Some देता है, क्योंकि आप एक ऐसा मूल्य बनाने के लिए कह रहे हैं जो मौजूद नहीं है। आपके मामले में, उदाहरण के लिए, Ops.valueOf("blah")None लौटाएगा, क्योंकि आपके पास उचित गणना मूल्य नहीं है।

ईमानदारी से कहूं तो, इस मामले में, मैं एक case class या एक Enumeration के बजाय एक case object का उपयोग करेंगे (वे बेहतर प्रकार सुरक्षा प्रदान करते हैं)।

-1

ऐसा लगता है कि मुझे लौटाई गई 'पाने' विधि का उपयोग करने की आवश्यकता है कुछ वास्तव में जो मैं चाहता था उसे प्राप्त करने के लिए। जैसे

ops.valueOf("create").get == Ops.Create 

न तो अंतर्ज्ञानी और न ही दोस्ताना लगता है लेकिन यह काम करता है।

+0

ऐसा इसलिए है क्योंकि 'गणना'valueOf' एक' विकल्प 'ऑब्जेक्ट देता है, जिसका अर्थ है कि आपको मूल्य मान प्राप्त करने के लिए' get' का उपयोग करना होगा। – mipadi

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