首先我们来看看他们的声明:
implicit def mkNumericOps (lhs: T): IntegralOps
implicit def mkOrderingOps (lhs: T): Ops
它们是隐式的,这意味着它们的目标是提供一些自动值或转换。请注意,它们都从T
到其他类型,其中T
是特征的类型参数:Integral[T]
.
所以,如果你有Integral[Int]
, then mkNumericOps
会给你一个自动转换Int
to IntegralOps
。这意味着您将能够从以下位置调用方法IntegralOps
or Ops
on an Int
(或者无论你的类型是什么Integral
).
现在,让我们看看这些方法是什么:
def % (rhs: T): T
def * (rhs: T): T
def + (rhs: T): T
def - (rhs: T): T
def / (rhs: T): T
def /% (rhs: T): (T, T)
def abs (): T
def signum (): Int
def toDouble (): Double
def toFloat (): Float
def toInt (): Int
def toLong (): Long
def unary_- (): T
这些来自IntegralOps
,这延伸了Ops
。关于它们的一个有趣的事情是它们中的许多已经定义在Int
!那么,如何以及为何使用它们呢?这是一个例子:
def sum[T](list: List[T])(implicit integral: Integral[T]): T = {
import integral._ // get the implicits in question into scope
list.foldLeft(integral.zero)(_ + _)
}
所以,给定任何类型T
其中有一个Integral[T]
隐式可用,您可以将该类型的列表传递给sum
.
另一方面,如果我使我的方法特定于该类型Int
,我可以不用写它Integral
。另一方面,我无法写出对两者都适用的东西Int
and Long
and BigInt
,因为它们不共享定义方法的共同祖先+
(更不用说“零”了)。
The foldLeft
上面的内容实际上可以翻译为:
list.foldLeft(integral.zero)((x, y) => mkNumericOps(x).+(y))