2014-01-31 54 views
0

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

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 

} 

回答

1

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

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

对于代码风格的一致性和other reasons然而,我会建议对(在这种情况下+)曾经使用中缀表示法比象征性的运营商以外的任何其他,即:

(500.m + 10.km).toKm