我试着在下面详细回答。简短的回答是不必将隐式值显式传递给其他方法的隐式参数。
据我了解,您不介意上下文边界的语法糖并且您理解这一点,所以我跳过了那部分。
假设您有两种排序方法,一种是对整个数组进行排序,另一种是对其中的一部分进行排序。他们有以下签名:
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]]
,在实现中的某处???
。)