我正在阅读应该像类型类一样工作的上下文边界和隐式参数。我看到的示例经常使用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)
答案 0 :(得分: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]]
,在???
实现中的某个位置。)