स्काला के पथ-निर्भर प्रकारों से क्या अभिप्राय है?


125

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


2
@ मिचेल - मुझे यह भी पता है कि पीडीटी क्या हैं; मैं उम्मीद कर रहा था कि SO को उत्तर के साथ समृद्ध किया जा सकता है!
oxbow_lakes

1
मुझे आशा है कि PDT
स्टेकर

जवाबों:


165

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

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है जिससे यह तात्कालिक था। सभी प्रकार की चीजें हैं जो इस के साथ पूरी की जा सकती हैं, एक प्रकार की सुरक्षा दे रही हैं जो मूल्यों पर निर्भर हैं और अकेले प्रकार नहीं।

यह निर्भर प्रकारों की तरह लग सकता है, लेकिन यह अधिक सीमित है। उदाहरण के लिए, के प्रकार के 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

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

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

1
वास्तव में, मेरा यही मतलब है। प्रारंभ में मैंने पढ़ा कि प्रकार कंस्ट्रक्टर को दिए गए मानों पर निर्भर था, न कि बी 1 / बी 2। मैं इसे अब समझता हूं, लेकिन इसे प्राप्त करने के लिए मुझे कुछ पढ़ना चाहिए।
मैथ्यू फेयरवेल

3
सबसे आसान व्याख्या यह है कि पथ-निर्भर प्रकार केवल क्लोजर के साथ कक्षाएं हैं, ठीक उसी तरह से कार्य चर से गुंजाइश को बांध सकते हैं।
polkovnikov.ph

1
लेकिन शायद इस सादृश्य में एक बुनियादी अंतर है: एक बंधन रनटाइम (क्लोजर के लिए) पर होता है और दूसरा बाध्यकारी संकलन समय (पथ पर निर्भर प्रकारों के लिए) पर होता है।
झेगुडस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.