私は Programming Scala の本 (Martin Odersky、Lex Spoon、Bill Venners ed1 著) を読んでいて、ある特徴に出会いました。私が興味深いと思うセクションは、積み重ね可能な変更です。使用例は
abstract class IntQueue {
def get(): Int
def put(x: Int)
}
trait Incrementing extends IntQueue {
abstract override def put(x: Int) {super.put(x+1)}
}
trait Filtering extends IntQueue{
abstract override def put(x: Int){
if(x >=0) super.put(x)
}
}
したがって、提供されている例には、次のように IntQueue を拡張する具体的なクラス「BasicIntQueue」があります
import scala.collection.mutable.ArrayBuffer
class BasicIntQueue extends IntQueue{
private val buf = new ArrayBuffer[Int]
def get() = buf.remove(0)
def put(x: Int) {buf +=x}
}
scala> val queue = (new BasicIntQueue with Incrementing with Filtering)
scala> queue.put(-1);queue.put(0);queue.put(1)
scala> queue.get() = 1
したがって、この例では、フィルタリングとインクリメントの両方が「連鎖」され、要素がキューに「入れられる」前に実行されることを示しています。
これを Groovy でどのように実現できるかを考えていました。おそらく、Groovy のメタ プログラマビリティのために必要ないのでしょう。