gpt4 book ai didi

scala - 动态混合特征

转载 作者:行者123 更新时间:2023-12-03 01:20:56 27 4
gpt4 key购买 nike

有一个特质

trait Persisted {
def id: Long
}

如何实现一个方法,该方法接受任何案例类的实例并返回其混合了特征的副本?

该方法的签名如下所示:

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 类和 Persisted 的本地类,很像 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 的示例

关于scala - 动态混合特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10373318/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com