サーチ…


カスタム挿入演算子の定義

Scalaの演算子( +-*++など)は単なるメソッドです。例えば、 1 + 21.+(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  

中置演算子は引数が1つしかないことに注意してください。オペレータの前にあるオブジェクトは、そのオペレータの後のオブジェクト上でそれ自身のオペレータと呼ばれます。 1つの引数を持つ任意のScalaメソッドを中置演算子として使用できます。

これは傍観と一緒に使うべきです。あなた自身のメソッドが、そのオペレータから期待されるものを正確に行う場合にのみ、一般的には良い練習とみなされます。疑問がある場合は、 +代わりにaddように、より慎重な名前を付けてください。

カスタム単項演算子の定義

単項演算子は、演算子の前にunary_unary_て定義できます。単項演算子は、 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