在我们的库中,我们有一个这样定义的宏:
def extractNamed[A]: Any = macro NamedExtractSyntax.extractNamedImpl[A]
此宏使用其类型签名返回一个 apply
方法,其参数与输入它的案例类的 apply
方法相匹配。
想法是,这允许我们库的用户像这样使用 Scala 的命名参数:
lazy val fruitExtractor = extractNamed[Fruit](
name = FruitTable.name,
juiciness = FruitTable.juiciness
)
但是,这似乎不起作用 - 它反而在编译时返回 error: Any does not take parameters
。
这似乎是由 SI-7914 引起的因为如果用户显式调用 apply 它确实有效,即:
lazy val fruitExtractor = extractNamed[Fruit].apply(
name = FruitTable.name,
juiciness = FruitTable.juiciness
)
我们可以通过简单地将返回的方法重命名为合理的名称来解决这个问题,但是有没有其他方法可以在不需要显式方法调用的情况下解决这个问题?
最佳答案
如何从宏中返回 Dynamic
的子类?然后你可以定义 applyDynamic
和 applyDynamicNamed
来做你想做的事。为了额外的编译时安全性,您也可以将那些 xxxDynamic
方法设置为宏。我刚刚检查过,这完全符合您想要的语法。
关于scala - Scala 错误 SI-7914 - 从 Scala 宏返回应用方法是否有任何解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26577588/