在我们的库中,我们有一个宏定义如下:
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
)
我们可以通过简单地将返回的方法重命名为合理的方法来解决这个问题,但是有没有其他方法可以解决这个问题而不需要显式的方法调用?
答案 0 :(得分:2)
如何从宏中返回Dynamic
的子类?然后,您可以定义applyDynamic
和applyDynamicNamed
来执行您想要的操作。为了提高编译时的安全性,您可以将这些xxxDynamic
方法作为宏。我刚检查过,这与您想要的语法完全一致。