2011-12-20 8 views
9

द्वारा उदाहरण पुस्तक स्काला पढ़ना और वहाँ इस उदाहरण जब मार्टिन बताते पेज 54 पर सीमा टाइप है:उदाहरण के द्वारा स्कैला - संदर्भ सीमाओं के साथ विशेषता प्रकार पैरामीटर गलती?

trait Set[A <: Ordered[A]] { 
    def incl(x: A): Set[A] 
    def contains(x: A): Boolean 
} 

और

trait Set[A <% Ordered[A]] ... 

आगे पेज 55 पर उन्होंने यह भी कहा गया है कि <:/टाइपिंग बाध्यता संभावनाओं को प्रदर्शित करने के लिए <% विशेषता सेट के लिए आवश्यक एकमात्र परिवर्तन है।

हालांकि, जब मैं अपने कोड के साथ उदाहरण दोहराता हूं, तो आईडीई शिकायत करता है कि लक्षणों में दृश्य सीमाएं नहीं हो सकती हैं, केवल सीमाएं टाइप करें। विशेषता शब्द को अमूर्त वर्ग में बदलना या बाध्य सहायता टाइप करने के लिए बाध्य दृश्य को बदलना। क्या यह पुस्तक में एक गलती है?

+3

सुधार के लिए स्थान "स्केल द्वारा उदाहरण" लिखा गया था, इसके बाद spec में बदलाव आया था। [यह चर्चा] देखें (http://scala-programming-language.1934581.n4.nabble.com/scala-view-bound-in-trait-td1991172.html) –

+0

इंगित करने के लिए धन्यवाद! हालांकि मुझे लगता है कि यह अच्छा नहीं है कि कार्यान्वयन की जटिलता भाषा को प्रभावित करती है। लक्षणों के ऊपरी सीमाएं क्यों नहीं हो सकती हैं इसका कोई तार्किक स्पष्टीकरण नहीं है। – noncom

+3

लक्षणों में ऊपरी सीमाएं हो सकती हैं। उनके पास संदर्भ और सीमाएं नहीं हो सकती हैं, क्योंकि ये कन्स्ट्रक्टर पैरामीटर हैं, और गुणों में कन्स्ट्रक्टर पैरामीटर नहीं हो सकते हैं। –

उत्तर

7

के हमारे शक्तिशाली उपकरण को समझने के लिए क्या चल रहा है आरईपीएल कहा जाता है का उपयोग करते हैं:

scala> trait Example[A<:Ordered[A]] { def contains(x:A):Boolean } 
defined trait Example 

scala> class Example2[A<%Ordered[A]](val a:A) { def isLower(otherA:A):Boolean = a< otherA } 
defined class Example2 

scala> :javap Example 
Compiled from "<console>" 
public interface Example{ 
    public abstract boolean contains(scala.math.Ordered); 
} 


scala> :javap Example2 
Compiled from "<console>" 
public class Example2 extends java.lang.Object implements scala.ScalaObject{ 
    public java.lang.Object a(); 
    public boolean isLower(java.lang.Object); 
    public Example2(java.lang.Object, scala.Function1); 
} 

आप देख सकते हैं, देखने के लिए बाध्य Example2 निर्माता का दूसरा तर्क हो जाता है। चूंकि एक विशेषता में कोई कन्स्ट्रक्टर नहीं है, स्पष्ट रूप से दृश्य को प्रदान करना संभव नहीं है।

क्यों इस पूर्व में जारी हुए में संभव हो गया है मेरे लिए एक रहस्य (शायद एक अतिरिक्त Function1 वैल विशेषता के अंदर बनाया है और संकलक द्वारा भरा हुआ था?)

स्काला विकास के बारे में अपने प्रश्न के संबंध में है, यह परिपक्व है और शक्तिशाली। आप प्रमुख रिलीज (2.8, 2.9, 2.10) के बीच परिवर्तन की उम्मीद कर सकते हैं, लेकिन मैं स्केल को इस पर पर्याप्त परिपक्व नहीं मानूंगा। हालांकि, हमेशा