Поиск…


Определение пользовательских операторов 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

Это следует использовать с участием. Перегрузка унарного оператора с определением, которое не является ожидаемым, может привести к путанице кода.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow