【问题标题】:Is there any workaround for Scala bug SI-7914 - returning an apply method from a Scala macro?Scala bug SI-7914 是否有任何解决方法 - 从 Scala 宏返回应用方法?
【发布时间】:2014-12-22 01:01:47
【问题描述】:

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

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
)

我们可以通过简单地将返回的方法重命名为合理的名称来解决这个问题,但是有没有其他方法可以解决这个问题而不需要显式的方法调用?

【问题讨论】:

    标签: scala macros scala-macros


    【解决方案1】:

    如何从宏中返回Dynamic 的子类?然后你可以定义applyDynamicapplyDynamicNamed 来做你想做的事。为了获得额外的编译时安全性,您也可以将这些 xxxDynamic 方法设置为宏。我刚刚检查过,这完全符合您想要的语法。

    【讨论】:

    • 这非常有效。唯一的问题是需要在调用站点导入 scala.language.dynamics。这可以通过使宏导入来避免这种情况: c.Expr(q"import scala.language.dynamics; new Dynamic { ..$liftedApplyMethods }")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2011-04-29
    • 2023-03-06
    相关资源
    最近更新 更多