Saya pernah mendengar bahwa Scala memiliki tipe yang bergantung pada jalur. Ini ada hubungannya dengan kelas batin tapi apa sebenarnya artinya ini dan mengapa saya peduli?
Saya pernah mendengar bahwa Scala memiliki tipe yang bergantung pada jalur. Ini ada hubungannya dengan kelas batin tapi apa sebenarnya artinya ini dan mengapa saya peduli?
Jawaban:
Contoh favorit saya:
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
Jadi, jenisnya Coordinate
bergantung pada instance Board
dari mana ia dibuat. Ada banyak hal yang dapat dilakukan dengan ini, memberikan semacam keamanan tipe yang bergantung pada nilai dan bukan tipe saja.
Ini mungkin terdengar seperti tipe tergantung, tetapi ini lebih terbatas. Misalnya, tipe occupied
bergantung pada nilai Board
. Di atas, baris terakhir tidak berfungsi karena jenisnya c2
adalah b2.Coordinate
, sedangkan occupied
jenisnya adalah Set[b1.Coordinate]
. Perhatikan bahwa seseorang dapat menggunakan pengenal lain dengan jenis yang sama b1
, jadi bukan pengenal b1
yang terkait dengan jenis tersebut. Misalnya, karya berikut ini:
val b3: b1.type = b1
val c3 = b3.Coordinate(10, 10)
b1.occupied += c3