2009-02-23 6 views
7

में टुपल प्रकारों को अनपॅक करना मैं बस सोच रहा था, क्या मैं स्केल में अपने घटकों के प्रकारों में एक ट्यूपल प्रकार को विघटित कर सकता हूं?स्कैला

मेरा मतलब है, यह

trait Container { 
    type Element 
} 

trait AssociativeContainer extends Container { 
    type Element <: (Unit, Unit) 
    def get(x : Element#First) : Element#Second 
} 

उत्तर

3

आप खोल नहीं कर सकते हैं की तरह कुछ, दर असल, लेकिन शायद आप यही चाहते को प्राप्त होता है:

type First 
    type Second 
    type Element = (First, Second) 
    def get(x: First): Second 
+0

यही मैंने सोचा कि मुझे ऐसा करने की ज़रूरत है, लेकिन इससे बचना चाहता था, क्योंकि इससे इस विशेषता को विस्तारित करने वाले वर्गों के कार्यान्वयन में बदलाव आएगा। – jpalecek

+0

इसके अलावा, क्या इसका मतलब यह है कि एलिमेंट जोड़ी उप-वर्गों में भी एक ही जोड़ी होगी? यह तत्व नहीं होना चाहिए <: (पहला, दूसरा) [या शायद कम बाध्य, भी]? – jpalecek

0

मैं यह करने के लिए देर से एक सा हूँ, लेकिन पैटर्न मिलान का उपयोग करने के बारे में क्या? काफी सही वापसी प्रकार नहीं है, और मेरे वाक्य रचना थोड़ा दूर हो सकता है, लेकिन यहाँ जाता है:

def get[K](key: K): Iterable[Any] { 
    for ((key, x) <- elements) yield x 
} 
3

इस प्रकार खोल नहीं करता है, लेकिन यह प्रकार A और B जब get बुला विवश करता है ।

trait Container { 
    type Element 
} 

trait AssociativeContainer extends Container { 
    type Element <: Tuple2[_, _] 

    def get[A, B](x: A)(implicit ev: (A, B) =:= Element): B 
} 

इस होनहार है, लेकिन धोखा दे रहा है - अगर Element सार है यह काम नहीं करता।

def Unpack[T<:Tuple2[_, _]] = new { 
    def apply[A, B](implicit ev: T <:< (A, B)) = new { 
    type AA = A 
    type BB = B 
    } 
} 

trait AssociativeContainer { 
    type Element = (Int, String) 
    val unpacked = Unpack[Element].apply 
    type A = unpacked.AA 
    type B = unpacked.BB 

    1: A 
    "": B 
    def get(x: A): B 
}