Scala Language
Перегрузка оператора
Поиск…
Определение пользовательских операторов Infix
Операторы Scala (такие как +
, -
, *
, ++
и т. Д.) - это просто методы. Например, 1 + 2
можно записать как 1.+(2)
. Такие методы называются «инфиксными операторами» .
Это означает, что пользовательские методы могут быть определены на ваших собственных типах, повторно используя эти операторы:
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)
}
}
Эти операторы, определенные как-методы, могут быть использованы следующим образом:
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
Обратите внимание, что операторы infix могут иметь только один аргумент; объект перед тем, как оператор вызовет его собственный оператор на объект после оператора. Любой метод Scala с единственным аргументом может использоваться как оператор инфикса.
Это следует использовать с участием. Обычно это считается хорошей практикой, только если ваш собственный метод делает именно то, чего можно ожидать от этого оператора. В случае сомнений используйте более консервативное название, например
add
вместо+
.
Определение пользовательских унарных операторов
Унарные операторы могут быть определены путем добавления оператора с помощью unary_
. Унарные операторы ограничены unary_+
, unary_-
, unary_!
и 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)
}
}
Унарный оператор можно использовать следующим образом:
val a = new Matrix(2, 2, Seq(Seq(1,2), Seq(3,4)))
val negA = -a
Это следует использовать с участием. Перегрузка унарного оператора с определением, которое не является ожидаемым, может привести к путанице кода.