2010-04-07

Stackable Modifications

Scala里面支持trait,可以提供类似Ruby mixin以及Java interface的功能,还有一个有趣的功能是 "stackable modification",感觉很像Ruby中常提到的 monkey patch。摘录 "Programming in Scala" 中的一个小例子,假设有个整型数构成的队列,提供两个基本操作:put和get,分别用于存、取一个数。接下来,我们对存入数据分别做三种操作:

  1. 倍乘 - 对输入数据n,存入n * 2;

  2. 增一 - 对输入数据n,存入n + 1;

  3. 过滤 - 对输入数据n,当且仅当 n 不为负数时才存入。


这在Scala里面实现起来相当舒服:

> abstract class IntQueue {
>   def get(): Int
>   def put(x: Int)
> }
>
> 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 }
> }
>
> trait Doubling extends IntQueue {
>   abstract override def put(x: Int) {super.put(2 * x)}
> }
>
> trait Incrementing extends IntQueue {
>   abstract override def put(x: Int) {super.put(1 + x)}
> }
>
> trait Filtering extends IntQueue {
>   abstract override def put(x: Int) {
>     if (x >= 0) super.put(x)
>   }
> }


val q = new BasicIntQueue with Doubling
这样在q中存入10,则会取回20。

val q = new BasicIntQueue with Incrementing with Doubling
这样在q中存入14,则会取回29(double一次再增一)。

标签:

0 Comments:

发表评论

<< Home