2

我正在阅读应该像类型类一样工作的上下文边界和隐式参数。我看到的例子经常使用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)
4

1 回答 1

4

我试着在下面详细回答。简短的回答是不必将隐式值显式传递给其他方法的隐式参数。

据我了解,您不介意上下文边界的语法糖并且您理解这一点,所以我跳过了那部分。

假设您有两种排序方法,一种是对整个数组进行排序,另一种是对其中的一部分进行排序。他们有以下签名:

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]],在实现中的某处???。)

于 2014-03-06T22:56:33.473 回答