2011-04-02 74 views
3

我看到了一些例子,其中一個轉換函數T => S作爲隱式參數傳遞。斯卡拉calls這個函數view,甚至提供特殊的語法糖 - view bound - 對於這種情況。關於Scala中視圖的問題

但是,我們已經有隱式轉換!我可以用隱式轉換替換這些views(即轉換函數作爲隱式參數傳遞)嗎? ?我能做些什麼views我不能用隱式轉換嗎?

回答

9

我你的問題的理解是,會是什麼

case class Num(i: Int) 
implicit def intToNum(i: Int) = Num(i) 

def test[A <% Num](a: A): Int = a.i 
test(33) 

優於

def test2(a: Num): Int = a.i 
test2(33) 

是?那麼觀點的含義就是:T型可以被看作另一種類型S.你的方法或功能可能首先要處理T.一個例子是有序:

def sort[A <% Ordered[A]](x: A, y: A): (A, A) = if (x < y) (x, y) else (y, x) 

sort(1, 2)  // --> (1,2) 
sort("B", "A") // --> (A,B) 

兩個以上的用例圖界限:

  • 你可能想在T轉換至S只在某些情況下,例如懶惰的 (這與上面的情況是一樣的:你基本上想和T一起工作)
  • 你可能想鏈鎖隱式轉換。看到這篇文章:How can I chain implicits in Scala?
3

你所說的隱式轉換隻不過是全局範圍內的一個視圖而已。

在使用類型參數時,必須使用視圖邊界,因爲這是一個需要隱式轉換的標誌。例如:

def max[T](a: T, b: T): T = if (a < b) b else a 

因爲任何有關於T沒有約束,編譯器不知道,<方法可用。讓我們來看看編譯器讓你繼續與,然後再考慮這兩個調用:

max(1, 2) 
max(true, false) 

沒有什麼在告訴編譯器不應該允許第二個呼叫簽名max[T](a: T, b: T): T,但應該允許第一。這是鑑於邊界進來:

def max[T <% Ordered[T]](a: T, b: T): T = if (a < b) b else a 

,不僅講述在<方法來自編譯器,但也告訴max(true, false)是無效的編譯器。