2011-06-01 19 views
38

संभव डुप्लिकेट:
Tuple parameter declaration and assignment oddityक्या स्कैला में चर के लिए टुपल असाइनमेंट संभव है?

स्काला में, एक बहु-चर काम tuples के माध्यम से कर सकते हैं:

val (a, b) = (1, 2) 

लेकिन चर के काम के लिए एक समान वाक्य रचना नहीं करता है काम करने के लिए प्रतीत नहीं होता है। उदाहरण के लिए मैं यह करने के लिए करना चाहते हैं:

var (c, d) = (3, 4) 
(c, d) = (5, 6) 

मैं कई-चर काम में c और d पुन: उपयोग करना चाहते हैं। क्या यह संभव है?

उत्तर

46

यह केवल "एकाधिक चर असाइनमेंट" नहीं है, यह पूरी तरह से विशेष रुप से प्रदर्शित पैटर्न मिलान है!

तो निम्नलिखित सभी मान्य हैं:

val (a, b) = (1, 2) 
val Array(a, b) = Array(1, 2) 
val h :: t = List(1, 2) 
val List(a, Some(b)) = List(1, Option(2)) 

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

var x: Int = _ 
var y: Int = _ 

val (a, b) = (1, 2) 
x = a 
y = b 

// or 

(1,2) match { 
    case (a,b) => x = a; y = b 
    case _ => 
} 
3

मुझे नहीं लगता कि आप क्या चाहते हैं संभव है, लेकिन आप "जादुई" अद्यतन विधि के साथ कुछ समान प्राप्त कर सकते हैं।

case class P(var x:Int, var y:Int) { 
    def update(xy:(Int, Int)) { 
    x = xy._1 
    y = xy._2 
    } 
} 

val p = P(1,2) 
p() = (3,4) 
+5

ओएमजी, क्या मुझे यह समझना है? एक परिवर्तनीय असाइनमेंट करने के लिए बस? – ziggystar

+0

और म्यूटेबल सदस्यों के साथ एक केस क्लास? यह ठीक है? – ziggystar

+0

यह पूरी तरह से मान्य है, भले ही यह कोड गंध का थोड़ा सा है –

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