【发布时间】:2019-11-16 21:01:54
【问题描述】:
我想为一个接受 1 个类型参数的类生成函数,它包含一个按名称的值。
class C[T](_t: => T) {
def t: T = _t
}
我想生成的函数是由T 上可用的函数派生的。
我真正想要的是获得所有可用于T 的功能,以编程方式更改它们的合同和实现,并使其可用于C.
通过更改他们的合同,我的意思是更改他们的签名,以便他们返回
C[R],其中R代表原始函数的返回类型。通过更改它们的实现,我的意思是在返回之前将结果包装在
C中。
例如。
def +(that: Int): Int =
this + that
将在C[Int] 上可用
def +(that: Int): C[Int] =
C(this.t + that)
这样做是为了消除必须将计算包含在 C 中以使其不被评估的样板。
例如。
val c1 = new C(1)
val c2: C[Int] = C(c1.t + 1)
c2.t == 2
也可以表示为
val c2: C[Int] = c1 + 1
c2.t == 2
如何通过使用 Scala 2 或 dotty 宏来实现这一点?或者,这可以通过其他方式实现吗?
【问题讨论】:
标签: scala macros metaprogramming implicit dotty