2016-09-12 56 views
3

在訂貨特點我們可以發現這種隱含的方法:Implicits在訂貨

/** This implicit method augments `T` with the comparison operators defined 
* in `scala.math.Ordering.Ops`. 
*/ 
implicit def mkOrderingOps(lhs: T): Ops = new Ops(lhs) 

而且在同伴對象Ordering.Implicits可以發現:

/** This implicit creates a conversion from any value for which an 
    * implicit `Ordering` exists to the class which creates infix operations. 
    * With it imported, you can write methods as follows: 
    * 
    * {{{ 
    * def lessThan[T: Ordering](x: T, y: T) = x < y 
    * }}} 
    */ 
implicit def infixOrderingOps[T](x: T)(implicit ord: Ordering[T]): Ordering[T]#Ops = new ord.Ops(x) 

這是第二隱真的有必要嗎?在什麼情況下,應該使用第一個隱含的,在什麼情況下應該使用第二個?

謝謝。

回答

1

第一隱只能以Ordering範圍(它不是),或通過直接導入被使用,在延伸Ordering任何類型的範圍:

def foo[A](x: A, y: A)(implicit ord: Ordering[A]) = { 
    import ord.mkOrderingOps 

    x < y 
} 

注:1)將其導入您需要首先訂購一個訂購名稱(與def lessThan[T: Ordering](x: T, y: T) = ...不同); 2)如果您對範圍內的不同類型有兩項排序,則不能從兩個輸入mkOrderingOps而不對其進行重命名:import ord1.mkOrderingOps; import ord2.{mkOrderingOps => mkOrderingOps2}。 第二種方法既沒有這些問題。

我不知道的是1)爲什麼你會用第一個隱含的(也許它是在第二個之前引入的?); 2)爲什麼第二個沒有在scala.Predef中定義,這樣你就可以在不輸入任何內容的情況下使用操作符。