[英]What's the advantage of a Scala “context bound” over a normal parameter?
我正在閱讀應該像類型類一樣工作的上下文范圍和隱式參數。 我看到的示例經常使用Ordering[T]
。 就像是:
foo[T : Ordering](a: T, b: T)
這是糖
foo[T](a: T, b: T)(implicit ord: Ordering[T])
所以你可以在體內做類似的事情
ord.compare(a, b)
我以為我以前已經了解了這一點,現在我正在畫一個空白……與將其簡單地傳遞給函數相比,這有什么優勢。 例如:
foo[T](a: T, b: T, ord: Ordering[T])
/* or */ foo[T](a: T, b: T)(ord: Ordering[T])
foo(a, b, myOrdering)
/* or */ foo(a, b)(myOrdering)
我嘗試在下面詳細回答。 簡短的答案是不必將隱式值顯式傳遞給其他方法的隱式參數。
據我了解,您不介意上下文界限的語法糖,您了解這一點,因此我只跳過了這一部分。
假設您有兩種排序方法,一種是對整個數組進行排序,另一種僅對其中的一部分進行排序。 它們具有以下簽名:
sort[T](as: Array[T], ord: Ordering[T]): Unit = sort(as, 0, as.length, ord)
sort[T](as: Array[T], from: Int, to: Int, ord: Ordering[T]): Unit = ???
現在,如果有一個Ordering隱式值,並且有類似這樣的隱式參數:
sort[T](as: Array[T])(implicit ord: Ordering[T]): Unit = sort(as, 0, as.length/*)( ord*/)
sort[T](as: Array[T], from: Int, to: Int)(implicit ord: Ordering[T]): Unit = ???
或具有上下文范圍:
sort[T:Ordering](as: Array[T]): Unit = sort(as, 0, as.length/*)( ord*/)
sort[T:Ordering](as: Array[T], from: Int, to: Int): Unit = ???
瞧,我們不必為一般情況指定順序。 您可以通過更多深度傳遞參數來想象這一點。 在這種情況下,盡管沒有上下文綁定的聲明會有些乏味,但使用起來會更容易。
(為了完整起見,將實例與上下文綁定: ???
實現中的某個位置( implicitly[Ordering[T]]
)。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.