Scala Language
Przeciążenie operatora
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.