斯卡拉宏 : Add function to class

标签 scala reflection metaprogramming scala-2.10 scala-macros

我是 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 宏来做到这一点?还是有另一种方法可以实现这一目标?

最佳答案

当前无法添加、修改或删除宏外部可见的定义。 IE。您可以创建扩展的本地类或方法(例如,发出 ClassDef 树作为宏返回的结果的一部分),但没有影响外部世界的工具。

然而,我们计划用 http://scalamacros.org/future.html 中粗略描述的这个功能进行试验。 .此外,已经有一个可靠的原型(prototype)可以生成新的顶级类。想看的可以联系我了解详情。

关于斯卡拉宏 : Add function to class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13630366/

相关文章:

scala - 在Scala中创建一个使用枚举作为键的Map的语法是什么?

java - 在 Java 中使用反射迭代 Nd 数组的问题

scala - 如何读取扩展Any但不扩展AnyRef的Scala对象的类?

scala - 如何在Scala中获取方法列表

database - Akka Actor : Handling DB Failures Without Losing Data

scala - 用于依赖注入(inject) : multiple dependencies, 嵌套调用的 Reader Monad

java - 获取类中的所有变量名

c++ - 在可变参数模板上生成变量列表

ecmascript-6 - 在 ES6 中通过 Proxy 捕获类定义

groovy - Groovy 对象可以像带参数的函数一样被调用吗?