具有特质

trait Persisted {
  def id: Long
}

如何实现一个接受任何case类的实例并返回其特征混合在一起的副本的方法?

该方法的签名如下所示:
def toPersisted[T](instance: T, id: Long): T with Persisted

最佳答案

这可以通过宏来完成(自2.10.0-M3起,它们正式是Scala的一部分)。 Here's a gist example of what you are looking for

1)我的宏生成一个本地类,该类继承自所提供的case类并被持久化,就像new T with Persisted一样。然后,它缓存其参数(以防止进行多次评估)并创建所创建类的实例。

2)我怎么知道要生成什么树?我有一个简单的应用程序parse.exe,该应用程序可打印由解析输入代码产生的AST。因此,我只是调用了parse class Person$Persisted1(first: String, last: String) extends Person(first, last) with Persisted,记下了输出并在我的宏中复制了它。 parse.exe是scalac -Xprint:parser -Yshow-trees -Ystop-after:parser的包装。有多种探索AST的方法,请阅读"Metaprogramming in Scala 2.10"中的更多内容。

3)如果提供-Ymacro-debug-lite作为scalac的参数,则可以检查宏扩展。在这种情况下,所有扩展都将被打印出来,您将能够更快地检测到代码生成错误。

编辑。更新了2.10.0-M7的示例

08-25 11:36