def phrase[T](p: Parser[T]) = new Parser[T] {
def apply(in: Input) = lastNoSuccessVar.withValue(None) {
p(in) match {
case s @ Success(out, in1) =>
if (in1.atEnd)
s
else
lastNoSuccessVar.value filterNot { _.next.pos < in1.pos } getOrElse Failure("end of input expected", in1)
case ns => lastNoSuccessVar.value.getOrElse(ns)
}
}
}
上面的函数可以在Scala
的源代码中找到。
令我困惑的是:withValue
的声明是
def withValue[S](newval: T)(thunk: => S): S
然后,
=> S
是什么意思?
与match case
语法的关系是什么?
答案 0 :(得分:0)
=> S
的含义是能够提供S
的任何内容,无论是文字还是没有参数的函数。
作为参数定义,参数按名称,它允许在调用时不计算S
值,但在&#39;内部&#39; withValue
(仅在需要时)。参数的一种lazy val
等价物。
def foo:String = someComputation
withValue(&#34;文字&#34) withValue(富) //在传递给withValue之前没有调用foo
答案 1 :(得分:0)
参数=> S
的{{1}}类意味着thunk
是按名称调用参数。
通常,将参数传递给方法时,会在调用方法之前立即计算参数。使用call-by-name参数时,不会在调用方法时对其进行求值,而是仅在方法使用参数时进行求值。
这对于具有副作用或评估成本高昂的表达式非常有用 - 如果方法不需要评估参数的结果,则可以完全避免对它们进行评估。
在您的示例中,整个块thunk
是参数{ p(in) match { ... } }
传递给方法thunk
的内容。方法withValue
将仅在必要时评估块,而不是在调用withValue
之前评估块。
这与withValue
没有直接关系。