2
对于DSL,我想介绍一个基本上调用Vector.fill
的扩展方法,例如dup
。允许使用名称参数的隐式类的宏变体
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)
现在,我想使这一论证通过-name的值,这样下会正常工作:
math.random dup 4 // wrong: four times the same value
我在看this question,所以显然有一个与普通无解价值类,只有:
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
...取消价值类的好处,没有涉及拳击。
所以我想知道,是否有可能写一个宏,提供一个非实例化解决方案的参数是名称?
谢谢,这个工程。我从“类宏”编辑为“对象宏”,所以这反映了Scala 2.11中的当前宏API。 –
'class'有什么问题?这只是一个[宏包](http://docs.scala-lang.org/overviews/macros/bundles.html) – ghik
谢谢,我不知道宏包;但由于某种原因,它并没有用这种新风格编辑,所以我转向了古典风格。 –