0

この単純化された (そしてやや不自然な) 例は、私が探しているものにかなり近いものです。

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. より良い方法はありますか?(常により良い方法があります。)

4

1 に答える 1

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)
 }

この簡単な解決策には問題があり、2 つのオペランドが同じ型である場合にのみ問題ありません。

これはあなたの問題に対応しているようです:

        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

最後の例では、結果の型が 2 番目のオペランドの型であることがわかります。

于 2015-06-18T07:53:04.227 に答える