scala - Scala "context bound"与普通参数相比有什么优势?

标签 scala implicits context-bound

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

相关文章:

scala - 对 Scala 类型参数施加多个泛型类型约束

scala - Scala 隐式参数的 Groovy 等效项

scala - 关于Scala中类型类的问题

c# - 事件链/代理到原始对象

scala - Spark - 删除两个数组类型列之间的相交元素

scala - 从 Spark 中以 Map(String,List(String)) 形式列出/检索 HDFS 分区

scala - 在 Scala 中转换日期格式

iphone - 为我的网站构建具有一些 foursquare 功能的服务

Scala:如何在这里进行上下文绑定(bind)的 List[T] 转换?