我正在阅读有关上下文边界和隐式参数的内容,它们应该像类型类一样工作。我看到的例子经常使用Ordering[T]
。像这样的东西:
foo[T : Ordering](a: T, b: T)
这是糖
foo[T](a: T, b: T)(implicit ord: Ordering[T])
所以在 body 里你可以做类似的事情
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 = ???
看,我们不必指定一般情况的顺序。您可以通过更深度地传递参数来想象这一点。在这种情况下,使用会更容易,尽管没有上下文绑定(bind)的声明有点乏味。
(为了完整地获取具有上下文绑定(bind)的实例:隐式[Ordering[T]]
,位于???
实现中的某处。)
关于scala - Scala "context bound"与普通参数相比有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22237627/