scala 元编程

Ruby 经验的朋友都知道 Ruby 的元编程威力十分强大. 元编程可以在我们没有定义字段或者方法的时候进行动态使用。
那么我们使用 scala 怎么进行元编程呢?

在 scala 中我们需要 Dynamic 这个特质,我们查看源码发现,它并没有定义和实现任何方法和字段。
Dynamic 特质只起到标示作用, 该特质并不包含任何方法定义. 假如编译器查看到该特质, 在处理该特质时会遵循某一特殊协议.

1
trait Dynamic extends Any

在我们的定义的类中实现 Dynamic。并且导入 import scala.language.dynamics。 如下代码案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.gizwits.scala

import scala.language.dynamics

class Person extends Dynamic {

def show() = println("hell world")

def selectDynamic(field: String) = field match {

case "name" => "feel"
case "age" => 100
case _ => throw new RuntimeException("new field")
}

}

object DynamicsMethod {

def main(args: Array[String]): Unit = {


val person = new Person
person.show
println(person.name)
println(person.age)
}

}

如上,我们需要动态使用字段,则需要实现 selectDynamic 方法。 类似的其他使用

1
2
3
4
5
6
foo.method(“blah”) –> foo.applyDynamic(“method”)(“blah”)
foo.method(x = “blah”) –> foo.applyDynamic(“method”)((“x”,”blah”))
foo.field –> foo.selectDynamic(“field”)
foo.varia = 10 –> foo.updateDynamic(“field”)(10)
foo.arr(10)=13 –> foo.selectDynamic(“arr”).update(10,13)
foo.arr(10) –> foo.applyDynamic(“arr”)(10)