在宏扩展时生成函数

时间:2019-07-06 12:46:54

标签: scala macros metaprogramming implicit dotty

我想为一个接受1种类型参数的类生成函数

case class C[T] (t: T)

取决于T类型参数。

我想生成的函数是由T上可用的函数派生的。

我确切想要的是使所有功能可用于T,也可用于C

作为C[Int]的示例,我希望能够调用C上可用的任何函数,并将该函数调用分派到包含在其中的Int Int

C

如何通过使用Scala 2或dotty宏来实现此目标? 还是可以通过其他方式实现?

1 个答案:

答案 0 :(得分:3)

implicit conversions可以轻松实现您要执行的操作,因此您实际上并不需要宏:

case class C[T] (t: T)

object C { //we define implicit conversion in companion object
  implicit def conversion[T](c: C[T]): T = c.t
}

import scala.language.implicitConversions
import C._

val c1 = C(1)
assert(c1 + 1 == 2) //ok

val c2 = C(false)
assert(!c2 && true) //ok

使用隐式转换意味着,只要编译器注意到类型不匹配,它就会尝试使用隐式函数隐式转换值 em>。