5

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

4

2 回答 2

8

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

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

于 2012-11-29T18:47:08.197 回答
1

如果我没有完全困惑,简单的重载应该提供所需的行为吗?例如,这将起作用:

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)
于 2012-11-29T17:10:29.963 回答