簡體   English   中英

Scala:隱式轉換器,中綴符號和運算符優先級

[英]Scala:Implicit converters & infix notation & operator precedence

如果您發現所提供的代碼不在問題范圍內,請原諒。 在代碼s1 (500.m + 10.km) toKm的底部, (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的語法規則,您需要將其括在方括號中。

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

出於代碼風格的一致性和其他原因,我建議您不要對除符號運算符(在本例中為+ )以外的任何符號使用中綴表示法,即:

(500.m + 10.km).toKm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM