【问题标题】:What's the advantage of a Scala "context bound" over a normal parameter?Scala“上下文绑定”比普通参数有什么优势?
【发布时间】:2014-04-09 20:45:06
【问题描述】:

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

【问题讨论】:

  • 因为它是隐式的。您不必显式传递给其他隐式参数。

标签: scala implicits context-bound


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-06-12
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多