Stackable Modifications
Scala里面支持trait,可以提供类似Ruby mixin以及Java interface的功能,还有一个有趣的功能是 "stackable modification",感觉很像Ruby中常提到的 monkey patch。摘录 "Programming in Scala" 中的一个小例子,假设有个整型数构成的队列,提供两个基本操作:put和get,分别用于存、取一个数。接下来,我们对存入数据分别做三种操作:
- 倍乘 - 对输入数据n,存入n * 2;
- 增一 - 对输入数据n,存入n + 1;
- 过滤 - 对输入数据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一次再增一)。
标签: scala
0 Comments:
发表评论
<< Home