簡體   English   中英

與常規參數相比,Scala“上下文綁定”有什么優勢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM