对于 DSL,我想介绍一个dup
基本调用的扩展方法Vector.fill
,例如
import scala.collection.immutable.{IndexedSeq => Vec}
implicit final class Dup[A](private val in: A) extends AnyVal {
def dup(n: Int): Vec[A] = Vector.fill(n)(in)
}
3 dup 4 // Vector(3, 3, 3, 3)
现在我想让参数成为一个按名称的值,以便以下内容可以正常工作:
math.random dup 4 // wrong: four times the same value
我正在看这个问题,所以显然没有纯值类的解决方案,只有:
final class Dup[A](in: () => A) {
def dup(n: Int): Vec[A] = Vector.fill(n)(in())
}
implicit def Dup[A](in: => A): Dup[A] = new Dup(() => in)
math.random dup 4 // ok
...取消价值类的优势,即不涉及拳击。
所以我想知道,是否可以编写一个宏来提供非实例化解决方案,其中参数是按名称命名的?