scala宏:将函数添加到类

scala宏:将函数添加到类,scala,reflection,metaprogramming,scala-2.10,scala-macros,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

我是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宏做到这一点?或者有其他方法可以实现这一点吗?

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

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)

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


但是,我们计划对该功能进行试验,大致如中所示。另外,已经有了一个坚实的原型,可以生成新的顶级类。如果您想查看详细信息,请与我联系。

我只是想知道:
f
是否需要任何参数?如果是这样的话,通过为
f
本身添加类型注释来解决这个问题不是更合适吗?以后应该可以从两个函数示例中调用这两个f。我想到的最简单的方法是使用参数MyClass.f(3)vs.MyClass.f(“bla”)。如果有一种方法,我以后可以编写MyClass.f[String]和MyClass.f[Int](但不是MyClass.f[Double],因为没有定义),这也可以。你所说的f本身的类型注释是什么意思?嗯,在这种情况下,难道不可能用相应的类型重载函数吗?所以只有一个
f(i:Int){…}
和一个
f(s:String){…}
?这可以工作,但是f函数很复杂,我在很多地方需要它。因此,我想避免使用这个样板文件,并对其进行简化-例如,将函数插入类的宏。这正是我希望宏生成的结果。我不想自己编写这段代码,因为我需要在许多类中使用相同的f函数(但每次都可能使用不同的类型参数)。现在,您应该能够生成一个新类(使用c.IntroductOplevel),但是,有一种方法可以添加,在宏之外的现有实现上修改或删除?不,没有,尽管我们正在进行类似的工作。从Scala 2.11开始,关于这个话题的任何新闻都很难说会有什么结果?Scala中最相关(但仍然不够充分)的功能可以通过Scala 2.10/2.11和宏天堂插件实现:。