Scala Language
演算子のオーバーロード
サーチ…
カスタム挿入演算子の定義
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
中置演算子は引数が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