具有自动数字转换的中缀运算符

时间:2015-06-18 07:40:23

标签: scala implicit-conversion infix-operator

这个简化(并且有点人为)的例子与我正在寻找的非常接近。

implicit class PlusMinus(a: Double) {
  def +-(b: Double) = if (a > b) a-b else a+b
}

有了这个,我可以:

scala> 3 +- 4L
res0: Double = 7.0

scala> 5f +- 1
res1: Double = 4.0

scala> 7L +- 6f
res3: Double = 1.0

但我不得不怀疑:

  1. 每个结果都是Double。我可以模仿标准库中的自动数字转换吗?

    Int +- Int = Int
    Long +- Long = Long
    Long +- Float = Float  // etc.
    
  2. 有更好的方法吗? (总有更好的方法。)

1 个答案:

答案 0 :(得分:1)

您可以像这样实施您的运营商

 implicit class PlusMinus[T](a: T)(implicit ev : Numeric[T])  {
    def +-(b: T) = if (ev.gt(a, b)) ev.minus(a, b)  else ev.plus(a  , b)
 }

这个快速解决方案有一个问题,它只在两个操作数中使用相同的类型。

这个似乎回应了你的问题:

        implicit class PlusMinus[T](a: T)(implicit ev : Numeric[T])  {

        def +-(b: Double) = {
            val ad = ev.toDouble(a)
            if (ad > b) ad - b  else ad + b
        }

        def +-(b: Long) = {
            val ad = ev.toLong(a)
            if (ad > b) ad - b  else ad + b
        }

        def +-(b: Int) = {
            val ad = ev.toInt(a)
            if (ad > b) ad - b  else ad + b
        }

        def +-(b: Float) = {
            val ad = ev.toFloat(a)
            if (ad > b) ad - b  else ad + b
        }

        }

我们有结果

3 +- 4                                    //> res0: Int = 7
3 +- 4L                                   //> res1: Long = 7
3L +- 4                                   //> res2: Int = 7

您可以在上一个中看到结果类型是第二个操作数的类型。