【发布时间】:2012-11-17 19:07:54
【问题描述】:
我是 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 宏来做到这一点?或者有其他方法可以实现吗?
【问题讨论】:
-
我只是想知道:你想让
f接受任何参数吗?如果是这样,通过f本身的类型注释来解决这个问题不是更合适吗? -
稍后应该可以从双功能示例中调用两个 f。我想到的最简单的方法是使用参数 MyClass.f(3) 与 MyClass.f("bla")。如果有一种方法我以后可以写 MyClass.f[String] vs MyClass.f[Int](但不是 MyClass.f[Double],因为没有定义),这也可以。 f 本身的类型注释是什么意思?
-
嗯,在这种情况下,难道不能用各自的类型重载函数吗?所以只有一个
f(i: Int) { ... }和一个f(s: String) { ... }? -
这可行,但 f 函数很复杂,我在很多地方都需要它。所以我想避免使用这个样板文件并为其提供简写 - 例如将函数插入到类中的宏。
标签: scala reflection metaprogramming scala-2.10 scala-macros