2013-10-23 133 views
1

當我聲明class Pair[T : Ordering]時,它要求隱含值爲Ordering[T]。在下面的例子中,我試圖找出Ordering[Int]的隱含值來自哪裏。上下文綁定混淆

它看起來像​​應該是這裏的隱式值,但它沒有被導入,所以隱式值從哪裏得到?

class Pair[T : Ordering](val first: T, val second: T) { 
    def smaller(implicit ord: Ordering[T]) = 
     if(ord.compare(first, second) < 0) first else second 
} 

object Run extends App { 
    val p = new Pair[Int](2, 3) 
} 
+0

在Intellij中,你可以通過命令+ shift + p(不知道其他平臺的相關信息,可能是ctrl而不是命令)來了解什麼是implicits。 – Noah

+0

您應該知道,Scala標準'Predef'包含'Pair [A,B] = Tuple2 [A,B]'的別名。隱藏內置類型通常是一個糟糕的主意。還有'Triple [A,B,C] = Tuple3 [A,B,C]'。 –

回答

4

the language specification

類型牛逼組成的隱含範圍所有同伴模塊 (§5.4)分類與隱式參數的 類型相關聯。

頁的下一季度定義了裝置相連接這裏,但你的問題唯一重要的部分是OrderingOrdering[Int]相關,所以編譯器去尋找在the companion objectOrdering,並確定足夠了,有Int

0

我想這是因爲誠信是隱含有序特質豐富:

http://docs.scala-lang.org/sips/pending/implicit-classes.html

+0

編譯器最終會得到這個隱式的,但它首先命中'Ordering.Int'。我們可以通過'implicitly [Ordering [Int]]。toString'來打印,這將是'scala.math.Ordering $ Int $ blahblah'而不是'scala.math.LowPriorityOrderingImplicits $$ anon $ blahblah'。 –