Szukaj…


Definiowanie niestandardowych operatorów infix

W Scali operatory (takie jak + , - , * , ++ itd.) Są tylko metodami. Na przykład 1 + 2 można zapisać jako 1.+(2) . Tego rodzaju metody nazywane są „operatorami infix” .

Oznacza to, że można zdefiniować niestandardowe metody dla własnych typów, ponownie wykorzystując te operatory:

class Matrix(rows: Int, cols: Int, val data: Seq[Seq[Int]]){
  def +(that: Matrix) = {
    val newData = for (r <- 0 until rows) yield
      for (c <- 0 until cols) yield this.data(r)(c) + that.data(r)(c)

    new Matrix(rows, cols, newData)
  }
}

Tych operatorów zdefiniowanych jako metody można używać w następujący sposób:

val a = new Matrix(2, 2, Seq(Seq(1,2), Seq(3,4)))
val b = new Matrix(2, 2, Seq(Seq(1,2), Seq(3,4)))

// could also be written a.+(b)
val sum = a + b  

Zauważ, że operatory infix mogą mieć tylko jeden argument; obiekt przed operatorem wywoła własnego operatora na obiekcie za operatorem. Dowolną metodę Scali z jednym argumentem można zastosować jako operator infix.

Należy tego używać z parcimony. Jest to ogólnie uważane za dobrą praktykę tylko wtedy, gdy twoja własna metoda robi dokładnie to, czego można oczekiwać od tego operatora. W razie wątpliwości użyj bardziej konserwatywnego nazewnictwa, np. add zamiast + .

Definiowanie niestandardowych operatorów jednoargumentowych

Operatory jednoargumentowe można zdefiniować, dodając operator do unary_ . Jednoargumentowe operatory są ograniczone do unary_+ , unary_- , unary_! i unary_~ :

class Matrix(rows: Int, cols: Int, val data: Seq[Seq[Int]]){
  def +(that: Matrix) = {
    val newData = for (r <- 0 until rows) yield
      for (c <- 0 until cols) yield this.data(r)(c) + that.data(r)(c)

    new Matrix(rows, cols, newData)
  }

  def unary_- = {
    val newData = for (r <- 0 until rows) yield 
      for (c <- 0 until cols) yield this.data(r)(c) * -1
   
    new Matrix(rows, cols, newData) 
  }   
}

Jednoargumentowy operator może być używany w następujący sposób:

val a = new Matrix(2, 2, Seq(Seq(1,2), Seq(3,4)))
val negA = -a

Należy tego używać z parcimony. Przeładowanie jednoargumentowego operatora definicją inną niż oczekiwana może prowadzić do pomyłek w kodzie.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow