मैंने सुना है कि स्काला के पास पथ-निर्भर प्रकार हैं। यह आंतरिक वर्गों के साथ कुछ करने के लिए है, लेकिन इसका वास्तव में क्या मतलब है और मुझे इसकी परवाह क्यों है?
मैंने सुना है कि स्काला के पास पथ-निर्भर प्रकार हैं। यह आंतरिक वर्गों के साथ कुछ करने के लिए है, लेकिन इसका वास्तव में क्या मतलब है और मुझे इसकी परवाह क्यों है?
जवाबों:
मेरा पसंदीदा उदाहरण:
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