【问题标题】:How to call a function on an object with a generic type parameter using scala macros?如何使用 scala 宏在具有泛型类型参数的对象上调用函数?
【发布时间】:2019-10-24 06:10:02
【问题描述】:

考虑以下两个类,它们都有parseFrom 函数。

class X {}
object X {
  def parseFrom(b: Array[Byte]): String = "Hello"
}

class Y {}

object Y {
  def parseFrom(b: Array[Byte]): String = "HelloY"
}

我想写一个宏: getParseFrom[X] 将返回 X.parseFrom 函数。

这是我目前所拥有的:

import scala.reflect.macros.whitebox.Context

def getParseFromImpl[T: c.WeakTypeTag](c: Context): c.Tree = {
  import c.universe._
  val tpe = weakTypeOf[T]

  q"""
     $tpe.parseFrom(_)
   """
}

def getParseFrom[T]: Array[Byte] => String = macro getParseFromImpl[T]

scala 2.12 中的 scala 宏可以做到这一点吗?

【问题讨论】:

  • 创建一个简单的 typeclass 怎么样?

标签: scala generics scala-macros


【解决方案1】:

试试

q"""
  ${tpe.typeSymbol.companion}.parseFrom(_)
"""

【讨论】:

  • 如果 parseFrom 是 java 类 X 上的 java 静态方法而不是伴生对象上的方法,我该怎么办?
  • 有时对于内部类它不起作用...但是有 W/A 适用于 Scala 2.11/2.12/2.13 中的几乎所有情况,请参阅:github.com/plokhotnyuk/jsoniter-scala/blob/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
相关资源
最近更新 更多