Scala Language
Sovraccarico dell'operatore
Ricerca…
Definizione degli operatori Infix personalizzati
Negli operatori di Scala (come +
, -
, *
, ++
, ecc.) Sono solo metodi. Ad esempio, 1 + 2
può essere scritto come 1.+(2)
. Questi tipi di metodi sono chiamati "operatori infissi" .
Ciò significa che i metodi personalizzati possono essere definiti sui tuoi tipi, riutilizzando questi operatori:
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)
}
}
Questi operatori definiti come metodi possono essere utilizzati in questo modo:
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
Nota che gli operatori infissi possono avere un solo argomento; l'oggetto prima che l'operatore chiamerà il proprio operatore sull'oggetto dopo l'operatore. Qualsiasi metodo Scala con un singolo argomento può essere utilizzato come operatore infisso.
Questo dovrebbe essere usato con il parcimony. Generalmente è considerato una buona pratica solo se il proprio metodo fa esattamente ciò che ci si aspetterebbe da quell'operatore. In caso di dubbio, usa un nome più prudente, come
add
invece di+
.
Definizione di operatori unari personalizzati
Gli operatori unari possono essere definiti anteponendo l'operatore a unary_
. Gli operatori unary_+
sono limitati a unary_+
, unary_-
, unary_!
e 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)
}
}
L'operatore unario può essere utilizzato come segue:
val a = new Matrix(2, 2, Seq(Seq(1,2), Seq(3,4)))
val negA = -a
Questo dovrebbe essere usato con il parcimony. Sovraccaricare un operatore unario con una definizione che non è quella che ci si aspetterebbe può portare alla confusione del codice.