2013-07-02 29 views
6

這裏應用程序是一個短碼:Scala中:視

import scala.language.implicitConversions 

implicit def str2int(str:String) = str.toInt 

object Container { 
    def addIt[A](x: A)(implicit str2int: A => Int) = 123 + x 
    def addIt2(x: String)(implicit str2int: String => Int) = 123 + x 
} 

println(Container.addIt("123")); 
println(Container.addIt2("123")); 

兩個問題:

  1. 是 「(隱式str2int:A =>強度)」 稱爲視圖?當你說「視圖」時,它代表哪個特定部分的代碼?
  2. 爲什麼addIt返回246,而addIt2返回字符串「123123」?

任何有關此主題的好資源也將不勝感激。謝謝。

回答

4

查看錶示類型A可以被「查看」爲類型B,由隱式函數A => B指定。所以,是的,addItaddIt2中的隱含參數都是視圖。

addIt2返回123123,因爲它是(不幸)可以調用+上的兩個對象,其中一人是String。在Scala開始考慮應用str2int轉換的可能性之前,這將會啓動。如果你不希望出現這種情況,你可以明確地應用視圖:

def addIt2(x: String)(implicit str2int: String => Int) = 123 + str2int(x) 

或者你可以隱藏any2stringadd轉換:

object Container { 
    import Predef.{any2stringadd => _} 
    def addIt2(x: String)(implicit str2int: String => Int) = 123 + x 
} 
2
  1. 是的,它是一個隱含的觀點,但它不不表示任何代碼的特定部分。它只是說類型A應該是'可轉換的',最好是隱含的類型爲Int,例如。當這個方法被調用時,隱式轉換器應該在範圍內。

  2. 看起來像編譯器翻譯它看到的第一個方法123。+(x:A)並試圖找到'+'將編譯的類型A的隱式。

但是,在第二種情況下,它看到123。+(x:String),並且在Scala Predef中存在這種隱式轉換。這實際上是Scala實現中的一個怪癖。隱含的聲明是:

final class StringAdd(self: Any) { 
    def +(other: String) = self.toString + other 
} 

它留在斯卡拉的是用於語法像以前Java開發人員方便:123 + "something"並期望它是一個字符串。