斯卡拉宏:添加功能类(scala macros: Add function to class)

2019-07-04 06:23发布

我是新来斯卡拉宏和我使用的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宏来做到这一点? 还是有另一种方式来实现这一目标?

Answer 1:

这是目前无法添加,修改或删除宏外部可见的定义。 例如,你可以创建一个类或局部扩张的方法(例如发出ClassDef树由宏结果返回的一部分),但是没有工具来影响外部世界。

但是我们计划使用这一功能,如也大略勾勒实验http://scalamacros.org/future.html 。 也有已经是一个坚实的原型,可以产生新的顶级类。 与我联系了解详细信息,如果您想看一看。



Answer 2:

在情况下,我不能完全混为一谈,简单重载应提供所期望的行为? 举例来说,这会工作:

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)


文章来源: scala macros: Add function to class