0
请原谅,如果您发现提供的代码超出了问题的范围。代码的底部s1 (500.m + 10.km) toKm
表达式编译成功,但看起来并不自然。无论如何,我们可以实现这个语法(500 m + 10 km) toKm
?Scala:隐式转换器&中缀符号和运算符优先级
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
}