【问题标题】:Scala:Implicit converters & infix notation & operator precedenceScala:隐式转换器 & 中缀符号 & 运算符优先级
【发布时间】:2014-02-24 06:59:43
【问题描述】:

如果您发现提供的代码超出了问题的范围,请见谅。代码底部的 s1 (500.m + 10.km) toKm 表达式编译成功,但看起来并不自然。无论如何我们可以实现这种语法(500 m + 10 km) toKm

object Main extends App {
  sealed trait Measure {
    def toM: M = this match {
      case Km(km) => M(km * 1000)
      case m: M   => m
    }

    def toKm: Km = this match {
      case M(m)   => Km(m / 1000)
      case km: Km => km
    }
  }
  case class Km(val m: Double) extends Measure {
    def +(that: Any): Km = {
      that match {
        case Km(rhs) => Km(m + rhs)
        case M(rhs)  => Km(m + rhs / 1000)
      }
    }
    override def toString() = m + " km"
  }

  case class M(val m: Double) extends Measure {
    def +(that: Any): M = {
      that match {
        case Km(rhs) => M(m + rhs * 1000)
        case M(rhs)  => M(m + rhs)
      }
    }

    override def toString() = m + " m"
  }

  implicit class MeasureConverter(val measure: Double) extends AnyVal {
    def km = new Km(measure)
    def m = new M(measure)
  }

  val s1 = (500.m + 10.km) toKm

  val s2 = (500 m + 10 km) toKm

}

【问题讨论】:

    标签: scala dsl infix-notation


    【解决方案1】:

    由于 Scala 的语法规则,您需要将它们括在括号中。

    ((500 m) + (10 km)) toKm
    

    为了代码风格的一致性和other reasons,我建议不要对符号运算符(在这种情况下为+)以外的任何东西使用中缀表示法,即:

    (500.m + 10.km).toKm
    

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 2012-05-04
      • 2015-09-16
      • 1970-01-01
      • 2016-06-07
      • 2011-11-28
      • 2021-10-25
      • 2019-02-13
      • 2021-01-01
      相关资源
      最近更新 更多