编写检查scala中数字是否为0的泛型方法的最佳方法
我知道这对于一个简单的案例检查来说是非常微不足道的,但是似乎应该可以编写一个方法来执行以下操作,即泛化到所有数值类型:编写检查scala中数字是否为0的泛型方法的最佳方法,scala,Scala,我知道这对于一个简单的案例检查来说是非常微不足道的,但是似乎应该可以编写一个方法来执行以下操作,即泛化到所有数值类型: def checkNonZero(t: Long, field: String): List[String] = { if (t == 0) println("was zero") else println("wasn't zero") } 执行此操作的最佳方法是什么?这可以通过使用编号类型来完成 def checkNonZero(n: Number) = n
def checkNonZero(t: Long, field: String): List[String] = {
if (t == 0) println("was zero") else println("wasn't zero")
}
执行此操作的最佳方法是什么?这可以通过使用
编号
类型来完成
def checkNonZero(n: Number) = n != 0
或者,您可以使用Numeric
typeclass
def checkNonZero[T : Numeric](n: T) = {
val num = implicitly[Numeric[T]]
!num.equiv(n, num.zero)
}
编辑实际上,你可以这样写:
def checkNonZero[T : Numeric](n: T) = n != 0
当然,除非您定义新的
数值的自定义实例。Jasper-M的第二个解决方案的替代方法如下:
def isNotZero[A](n: A)(implicit num: Numeric[A]) = !num.equiv(n, num.zero)
这将隐式地保存行val num=Numeric[A]
,同时如果需要,仍然允许您使用num
尽管此方法实际上需要2个参数,但由于第二个参数是隐式的,因此可以像使用任何其他非通用单参数方法一样使用它:
isNotZero(3) // true
isNotZero(0.1) // true
isNotZero(0) // false
isNotZero(0.0) // false