2011-09-16 14 views
63

एक जादू हास्केल लेखन के बाद वापस स्काला के लिए आ रहा भर में इसका इस्तेमाल करने की है, मैं थोड़ा अधिक पठनीय मेरी कक्षा परिभाषाओं बनाने के लिए प्रकार कीवर्ड का उपयोग शुरू कर दिया है, जैसे:स्काला प्रकार कीवर्ड: कैसे सबसे अच्छा कई वर्गों

type RestfulParams = Map[String, String] 
def canonicalize(params: RestfulParams): String = { ... } 

जिस समस्या में मैंने भाग लिया है वह यह है कि इन प्रकार की परिभाषाओं को कक्षा या वस्तु के अंदर रहने की आवश्यकता होती है - वे "प्रथम श्रेणी के नागरिक" नहीं हैं जैसे कि वे हास्केल में हैं। यदि मैं किसी वर्ग या ऑब्जेक्ट के बाहर किसी प्रकार को परिभाषित करने का प्रयास करता हूं, तो मुझे एक कंपाइलर expected class or object definition मिलता है।

मेरी समस्या यह है कि पैकेज में कई वर्गों और ऑब्जेक्ट्स में इन प्रकारों का उपयोग कैसे करें? क्या मैं अब किया है काफी बदसूरत लगता है:

object RestfulTypes { type RestfulParams = Map[String, String] etc } 

और फिर एक और वर्ग फ़ाइल में:

import utils.{RestfulTypes => RT} 
def get(resource: String, params: RT.RestfulParams): String = { ... } 

वहाँ ऐसा करने का एक अच्छा तरीका है - और संयोग स्काला गुरु है लगता है कि यह एक अच्छी बात है चीज या बुरी चीज जो कि वर्गों/वस्तुओं के भीतर ही परिभाषित की जा सकती है?

+9

क्यों नहीं 'आयात utils.RestfulTypes._'? – soc

उत्तर

66

package objects आपके लिए काम करेगा?

लेख से:

2,8 तक, केवल बातें आप एक पैकेज में डाल सकता है कक्षाएं, लक्षण, और स्टैंडअलोन वस्तुओं थे। ये अब तक की सबसे आम परिभाषाएं हैं जो पैकेज के शीर्ष स्तर पर रखी जाती हैं, लेकिन स्कैला 2.8 आपको केवल उन तक ही सीमित नहीं करती है। किसी भी प्रकार की परिभाषा जिसे आप कक्षा के अंदर रख सकते हैं, आप पैकेज के शीर्ष स्तर पर भी डाल सकते हैं। यदि आपके पास कुछ सहायक विधि है तो आप पूरे पैकेज के दायरे में रहना चाहते हैं, आगे बढ़ें और इसे पैकेज के शीर्ष स्तर पर सही रखें। ऐसा करने के लिए, आप परिभाषाओं को पैकेज ऑब्जेक्ट में डाल देते हैं। प्रत्येक पैकेज को एक पैकेज ऑब्जेक्ट रखने की अनुमति है। पैकेज ऑब्जेक्ट में रखी गई किसी भी परिभाषा को पैकेज के सदस्य माना जाता है।

package object scala में पहले से ही कई प्रकार और मान हैं, इसलिए मुझे लगता है कि आप अपने ही प्रकार के लिए एक ही तकनीक का उपयोग कर सकते हैं।

11

मुझे यकीन है कि क्या इस मामले में सुंदरता का गठन नहीं कर रहा हूँ, लेकिन यहाँ दो विकल्प हैं:

एक विशेषता का उपयोग करना: (Scala's Selfless Trait Pattern)

trait RestfulTypes { 
    type Params = Map[String,String] 
    //... 
} 

object MyRestService extends RestService with RestfulTypes { /* ... */ } 

या सिर्फ वस्तु के सदस्यों आयात करते हैं, प्रभावी रूप से इसे का उपयोग एक पैकेज की तरह:

import util.RestfulTypes._ 
+1

@agilesteel: लिंक पहले नहीं होना चाहिए क्योंकि यह केवल पहले विकल्प से संबंधित है, कृपया संपादन करते समय मेरे उत्तर का अर्थ न बदलें। –

+0

धन्यवाद, निःस्वार्थ विशेषता पैटर्न बहुत अच्छा है। मुझे एहसास हुआ कि मैंने इसका उपयोग करके विभिन्न स्कैला ढांचे और औजारों को देखा है, बस यह नहीं पता था कि यह क्या था। उत्तर के लिए फिर से धन्यवाद। –

+0

@ किम: श्रीमान, फिर से नहीं होगा। – agilesteel

7

यून एक पैकेज ऑब्जेक्ट का उपयोग कर सकते हैं और वहां प्रकार की घोषणा डाल सकते हैं। जब आप उस पैकेज को आयात करते हैं तो टाइप परिभाषा उपलब्ध होगी।

एक उदाहरण:

पैकेज वस्तु क्रम में एक वस्तु उपसर्ग यानी myType.mine बिना प्रयोग करने योग्य होने के लिए पैकेज के रूप में एक ही नाम है
//package myType 
package object myType {type mine = List[String]} 

सूचना है कि आप उदाहरण के लिए एक अलग नाम के साथ इसे नाम हैं :

//package myType 
package object mainType {type mine = List[String]} 

इसे मुख्य प्रकार के साथ एक्सेस किया जा सकता है।मेरा जब आप "पैकेज" अधिक जानकारी के लिए

आयात: http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html

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