ประเภทที่ขึ้นกับพา ธ ของ Scala หมายถึงอะไร?


125

ฉันได้ยินมาว่า Scala มีประเภทที่ขึ้นกับเส้นทาง มันเกี่ยวกับคลาสชั้นใน แต่จริงๆแล้วมันหมายความว่าอย่างไรและทำไมฉันถึงสนใจ?


2
@ มิเชล - ฉันรู้ว่า PDT คืออะไร ฉันหวังว่า SO จะได้รับคำตอบ!
oxbow_lakes

1
ฉันหวังว่าจะมีคำตอบสั้น ๆ หลังจากอ่าน ch12 เกี่ยวกับ PDT
stacker

คำตอบ:


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 สำหรับคำตอบ ฉันพบว่าประโยคสุดท้ายสับสน: คุณพูดว่า 'ประเภทความปลอดภัยที่ขึ้นอยู่กับค่านิยมไม่ใช่ประเภทอย่างเดียว' สำหรับฉันแล้วสิ่งนี้ดูเหมือนจะเป็นประเภทที่ขึ้นต่อกัน แต่ประเภทที่ขึ้นกับเส้นทางไม่ได้ขึ้นอยู่กับค่าต่อตัว คิดว่างงเหมือนกันเหรอ?
Matthew Farwell

4
@ Matthew ผมเข้าใจสิ่งที่คุณพูด แต่เส้นทางขึ้นอยู่กับประเภทจะขึ้นอยู่กับค่าถึงแม้ว่ามันจะไม่ได้ให้ความยืดหยุ่นได้ตามปกติที่เกี่ยวข้องกับประเภทขึ้นอยู่กับ
Daniel C. Sobral

1
นั่นคือสิ่งที่ฉันหมายถึง ตอนแรกฉันอ่านว่าประเภทขึ้นอยู่กับค่าที่ส่งไปยังตัวสร้างไม่ใช่ b1 / b2 ตอนนี้ฉันเข้าใจแล้ว แต่ต้องใช้เวลาอ่านสองสามครั้งเพื่อให้เข้าใจ
Matthew Farwell

3
คำอธิบายที่ง่ายที่สุดคือประเภทที่ขึ้นกับพา ธ เป็นเพียงคลาสที่มีการปิดซึ่งเป็นวิธีเดียวกับที่ฟังก์ชันสามารถผูกตัวแปรจากขอบเขตได้
polkovnikov.ph

1
แต่อาจมีความแตกต่างพื้นฐานอย่างหนึ่งสำหรับการเปรียบเทียบนี้: การผูกหนึ่งเกิดขึ้นที่รันไทม์ (สำหรับการปิด) และการเชื่อมโยงอื่น ๆ จะเกิดขึ้นในเวลาคอมไพล์ (สำหรับประเภทที่ขึ้นกับพา ธ )
jhegedus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.