Given:Thứ tự và có thứ tự và so sánh lựa chọn
case class Person(name: String)
và cố gắng để làm:
scala> List(Person("Tom"), Person("Bob")).sorted
kết quả trong một đơn khiếu nại về việc thiếu Thứ tự.
<console>:8: error: could not find implicit value for parameter ord: Ordering[Person]
List(Person("Tom"), Person("Bob")).sorted
Tuy nhiên điều này:
case class Person(name: String) extends Ordered[Person] {
def compare(that: Person) = this.name compare that.name }
hoạt động tốt như mong đợi:
scala> List(Person("Tom"), Person("Bob")).sorted
res12: List[Person] = List(Person(Bob), Person(Tom))
mặc dù không có đặt hàng hoặc implicits liên quan.
Câu hỏi # 1: điều gì đang xảy ra ở đây? (Tiền của tôi là về cái gì ngầm ...)
Tuy nhiên, do ở trên và thực tế rằng đây:
scala> Person("Tom") > Person("Bob")
res15: Boolean = true
công trình, và đó cũng này:
scala> List(Some(2), None, Some(1)).sorted
công trình ra khỏi hộp:
res13: List[Option[Int]] = List(None, Some(1), Some(2))
tôi sẽ hy vọng điều này:
scala> Some(2) > Some(1)
cũng sẽ làm việc, tuy nhiên nó không:
<console>:6: error: value > is not a member of Some[Int]
Some(2) > Some(1)
Câu hỏi # 2: tại sao không, và làm thế nào tôi có thể lấy nó để làm việc?
Điều đó không thực sự trả lời câu hỏi tại sao việc triển khai Ordered [T] kỳ diệu mang lại một trường hợp Ordering [T]. Và tại sao bạn phải tạo một phương pháp để thực hiện so sánh cuối cùng? –
Tôi đã thực hiện phương pháp để tôi có thể truy cập vào phiên bản Ordering. Tôi nhập nội dung của cá thể đó để tôi có thể chuyển đổi ẩn của nó thành 'Ops', xác định một số toán tử so sánh. Sử dụng cùng phương thức đó, cuối cùng tôi đã tìm ra chính xác nơi chuyển đổi ngầm cho một 'Ordered' là gì. http://www.scala-lang.org/api/current/index.html#scala.math.LowPriorityOrderingImplicits – Dylan
Nhưng điều đó có vẻ khá nhiều công việc chỉ để có thể so sánh hai Tùy chọn? –