Scala:匹配大小写语法vs => S'

时间:2015-04-21 07:25:53

标签: scala

 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语法的关系是什么?

2 个答案:

答案 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没有直接关系。