[英]scala macros: Add function to class
我是scala宏的新手,我正在使用scala 2.10.0-RC3。
我想编写一个向类添加函数的宏。 用法示例:
trait MyTrait {
def addF = macro { /*add "def f = 3" to class*/ }
}
class MyClass extends MyTrait {
addF //Adds the "def f" to MyClass
}
object Main {
val t = new MyClass
assert(t.f==3)
}
我在以下场景中需要这个。 我的第一次尝试没有使用宏但没有用,因为我不能继承两次相同的特性。
trait AddF[T] {
def f(t: T) { /* ...do sthg ... */ }
}
class MyClass extends AddF[Int] with AddF[String]
使用宏解决方案,我可以写
class MyClass extends MyTrait {
addF[Int]()
addF[String]()
}
有没有办法用scala宏做到这一点? 或者有另一种方法来实现这一目标吗?
目前无法添加,修改或删除宏外可见的定义。 即你可以创建一个扩展本地的类或方法(例如,发出一个ClassDef树作为宏返回结果的一部分),但是没有办法影响外部世界。
但是,我们计划在http://scalamacros.org/future.html中粗略地概述此功能。 此外,还有一个可以生成新的顶级类的可靠原型。 如果您想看一下,请与我联系。
如果我没有完全混淆,简单的重载应该提供所需的行为? 例如,这可以工作:
trait MyTrait {
def f(i: Int)
def f(i: String)
}
class MyClass extends MyTrait {
def f(i: Int) {
println(i + " was an Int")
}
def f(s: String) {
println(s + " was a String")
}
}
// this allows:
val c = new MyClass()
c.f("hello")
c.f(42)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.