scala - Scala 错误 SI-7914 - 从 Scala 宏返回应用方法是否有任何解决方法?

标签 scala macros scala-macros

在我们的库中,我们有一个这样定义的宏:

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 的子类?然后你可以定义 applyDynamicapplyDynamicNamed 来做你想做的事。为了额外的编译时安全性,您也可以将那些 xxxDynamic 方法设置为宏。我刚刚检查过,这完全符合您想要的语法。

关于scala - Scala 错误 SI-7914 - 从 Scala 宏返回应用方法是否有任何解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26577588/

相关文章:

C++ 条件宏评估

scala - 如何使用 Scala 宏对方法调用中的命名参数进行建模?

scala - 如何运行官方反射示例

java - scala 和 spring data neo4j - 没有为字段配置 FieldAccessor

c# - 您将如何使用 Scala 的异步使多个异步请求超时?

oop - Scala 类继承

scala - Scala 3 宏中的显式类型转换

scala - 列出Scala中非默认文件系统上的文件

vim - 用于在 vim 中制作编号列表的宏?

将字符串文字与字 rune 字连接起来