2011-11-10 10 views
13

क्या ऑब्जेक्ट की प्रतिलिपि बनाने के लिए कोई तरीका है (या ऑब्जेक्ट्स की सूची भी बेहतर है)? मैं कक्षाओं की कस्टम वस्तुओं के बारे में बात कर रहा हूं जिन्हें अन्य वर्गों द्वारा बढ़ाया जा सकता है।स्कैला कॉपी ऑब्जेक्ट्स

उदाहरण:

class Foo() { 
    var test = "test" 
} 

class Bar() extends Foo { 
    var dummy = new CustomClass() 
} 

var b = new Bar() 
var bCopy = b.copy() // or something? 
+6

ध्यान दें कि यदि आप अपनी वस्तुओं को अपरिवर्तनीय रखते हैं तो आपको प्रतियां बनाने की आवश्यकता नहीं है। –

उत्तर

21

जावा में, वे इस समस्या को एक clone विधि है, कि सभी सुपर कक्षाओं में clone लागू करके काम करता है हल करने के लिए कोशिश की, लेकिन यह आम तौर पर टूटे हुए माना जाता है और सबसे अच्छा कारणों के लिए, बचा आप देख सकते हैं (उदाहरण के लिए here)।

तो स्कैला में, जावा में जीनरल के रूप में, आपको अपनी मनपसंद कक्षा के लिए अपनी प्रतिलिपि विधि बनाना होगा, जो आपको फ़ील्ड की गहरी बनाम उथली प्रतिलिपि जैसी चीजों को निर्दिष्ट करने की अनुमति देगा।

यदि आप कक्षा case class बनाते हैं, तो आपको copy विधि मुफ्त में मिलती है।

case class A(n: Int) 
val a = A(1)   // a: A = A(1) 
val b = a.copy(a.n) // b: A = A(1) 
val c = a.copy(2) // c: A = A(2) 

हालांकि मामले वर्गों से इनहेरिट अब मान्य नहीं है: यह है क्योंकि आप एक ही समय में कोई भी फ़ील्ड अद्यतन कर सकते हैं वास्तव में उस से बेहतर है,।

+0

ऐसा कुछ नहीं है: जावा में संग्रह.copy (list1, list2) लेकिन फिर स्कैला के लिए? – user485659

+1

@ user485659 यदि आप विशेष रूप से संग्रह के बारे में पूछ रहे हैं, तो आप दस्तावेज़ों की जांच कर सकते हैं और देख सकते हैं कि इस तरह की चीज़ों के लिए बहुत सारी विधियां हैं। उदाहरण के लिए, 'ऐरेबफर' में 'क्लोन' विधि है। लेकिन आम तौर पर आप अपरिवर्तनीय 'सूची' का उपयोग करेंगे, और जैसा कि डैनियल सोब्राल बताते हैं, प्रतिलिपि बनाने का कोई कारण नहीं है। –

+0

@ लुइगीप्लिंग केस कक्षाओं के काम के लिए प्रतिलिपि कैसे करता है? संदर्भ के द्वारा केवल कॉपी वैरिएबल क्या है, या कुछ और करते हैं? –

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

  • कोई संबंधित समस्या नहीं^_^