2010-04-22 12 views
110

मैंने सुना है कि स्कैला में पथ-निर्भर प्रकार हैं। यह आंतरिक वर्गों के साथ कुछ करने के लिए है लेकिन इसका वास्तव में क्या अर्थ है और मुझे परवाह क्यों है?स्कैला के पथ-निर्भर प्रकारों का क्या अर्थ है?

+2

@ मिशेल - मुझे यह भी पता है कि पीडीटी क्या हैं; मैं उम्मीद कर रहा था कि एसओ को जवाब के साथ समृद्ध किया जा सकता है! –

+1

मुझे उम्मीद है कि पीडीटी – stacker

+4

के बारे में ch12 पढ़ने के बाद एक संक्षिप्त जवाब है: | उत्तर के लिए – simao

उत्तर

143

मेरा पसंदीदा उदाहरण:

case class Board(length: Int, height: Int) { 
    case class Coordinate(x: Int, y: Int) { 
    require(0 <= x && x < length && 0 <= y && y < height) 
    } 
    val occupied = scala.collection.mutable.Set[Coordinate]() 
} 

val b1 = Board(20, 20) 
val b2 = Board(30, 30) 
val c1 = b1.Coordinate(15, 15) 
val c2 = b2.Coordinate(25, 25) 
b1.occupied += c1 
b2.occupied += c2 
// Next line doesn't compile 
b1.occupied += c2 

तो, Coordinate के प्रकार Board का उदाहरण है, जिसमें से यह instantiated गया था पर निर्भर है। ऐसी सभी चीजें हैं जिन्हें इस के साथ पूरा किया जा सकता है, एक प्रकार की सुरक्षा प्रदान करना जो मूल्यों पर निर्भर है और अकेले प्रकार नहीं।

यह निर्भर प्रकार की तरह ध्वनि सकता है, लेकिन यह अधिक सीमित है। उदाहरण के लिए, occupied का प्रकार Board के मान पर निर्भर है। इन सबसे ऊपर, अंतिम पंक्ति काम नहीं करता क्योंकि c2 के प्रकार, b2.Coordinate है, जबकि occupied के प्रकार Set[b1.Coordinate] है। ध्यान दें कि एक b1 के एक ही प्रकार के साथ एक और पहचानकर्ता का उपयोग कर सकते हैं, तो यह पहचानकर्ताb1 कि प्रकार से संबद्ध है नहीं है। उदाहरण के लिए, निम्नलिखित कार्य:

val b3: b1.type = b1 
val c3 = b3.Coordinate(10, 10) 
b1.occupied += c3 
+1

+1। मुझे अंतिम वाक्य उलझन में मिला: आप कहते हैं 'टाइप सुरक्षा जो मूल्यों पर निर्भर है और अकेले प्रकार नहीं है'। मेरे लिए, यह निर्भर प्रकारों की तरह लगता है, लेकिन पथ निर्भर प्रकार प्रति मानों पर निर्भर नहीं हैं। क्या आपको लगता है कि यह भ्रमित भी है? –

+2

@ मैथ्यू मैं समझता हूं कि आप क्या कह रहे हैं, लेकिन पथ निर्भर प्रकार _do_ मूल्यों पर निर्भर करता है, भले ही यह सामान्य रूप से निर्भर प्रकारों से जुड़ी लचीलापन प्रदान न करे। –

+0

मूल्यों से, क्या आपका मतलब बी 1 का मूल्य है, या मूल्य जो बी 1 (i.e 20) के निर्माता को पास किए गए हैं। यदि आप बी 1 का मतलब है तो मैं समझ सकता हूं, लेकिन मुझे उस प्रभाव को नहीं देख सकता है जो 20 कोड पर है। –

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