【问题标题】:Generate functions at macros expansion time在宏扩展时生成函数
【发布时间】:2019-11-16 17:55:20
【问题描述】:

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

case class C[T] (t: T)

取决于T 类型参数。

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

我真正想要的是让T 的所有功能都可用,C 也可用。

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

val c1 = new C(1)
assert(c1 + 1 == 2)

如何通过使用 Scala 2 或 dotty 宏来实现这一点? 或者,这可以通过其他方式实现吗?

【问题讨论】:

标签: scala macros metaprogramming implicit dotty


【解决方案1】:

使用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>。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 2016-01-14
  • 1970-01-01
相关资源
最近更新 更多