【问题标题】:scala macros: Add function to classscala宏:将函数添加到类
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 就目前而言,您应该能够生成一个新类(使用 c.introduceTopLevel) 但是,是否有一种方法可以在宏之外的现有实现上添加、修改或删除?
  • 不,没有,虽然我们正在做类似的事情。很难说会发生什么
  • 从 Scala 2.11 开始有关于这个主题的新闻吗?
  • Scala 中最相关(但仍然不够充分)的功能可以通过 Scala 2.10/2.11 和宏天堂插件来实现:docs.scala-lang.org/overviews/macros/annotations.html
【解决方案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)

【讨论】:

  • 这正是我希望宏生成的结果。我不想自己编写这段代码,因为我需要在许多类中使用相同的 f 函数(但每次都可能使用不同的类型参数)。
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多