在宏扩展时生成函数
Generate functions at macros expansion time
我想为接受 1 个类型参数的 class 生成函数
case class C[T] (t: T)
取决于 T
类型参数。
我想生成的函数是由 T
.
上可用的函数派生的
我真正想要的是让所有功能都可用于 T
,也可用于 C
。
作为 C[Int]
的示例,我希望能够在 C
上调用 Int
上可用的任何函数并将函数调用分派给 Int
包含在 C
.
val c1 = new C(1)
assert(c1 + 1 == 2)
如何使用 Scala 2 或 dotty 宏实现此目的?
或者,这可以通过其他方式实现吗?
你想做的事情很容易用 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
使用隐式转换意味着,只要编译器注意到类型不匹配,它就会尝试隐式转换值应用 隐式函数.
我想为接受 1 个类型参数的 class 生成函数
case class C[T] (t: T)
取决于 T
类型参数。
我想生成的函数是由 T
.
我真正想要的是让所有功能都可用于 T
,也可用于 C
。
作为 C[Int]
的示例,我希望能够在 C
上调用 Int
上可用的任何函数并将函数调用分派给 Int
包含在 C
.
val c1 = new C(1)
assert(c1 + 1 == 2)
如何使用 Scala 2 或 dotty 宏实现此目的? 或者,这可以通过其他方式实现吗?
你想做的事情很容易用 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
使用隐式转换意味着,只要编译器注意到类型不匹配,它就会尝试隐式转换值应用 隐式函数.