scala – def或val或lazy val用于语法规则?

我知道def和val之间的区别和lazy val一般,但是我不确定它们对Parser Combinators的影响.我见过的所有例子都包含这样的代码:

def statement: Parser[Statement] =
  ifStatement |
  whileStatement |
  expressionStatement | ...

从我做过的一些实验来看,似乎val和lazy val也可以工作,但是我不确定是否存在它们不再工作的情况,例如递归或定位解析器或诸如此类的东西.

请赐教!

最佳答案 如果你看一下
the api documentation,解析器构建方法和运算符是使用名称参数实现的,然后是
cached using lazy val.

话虽这么说,你仍然需要注意初始化的顺序.以下代码将导致空引用异常:

val as = a.*
val a = "a"

但是以下情况很好(因为〜的参数是名字):

val as = "a" ~ a.*
val a = "a"

把懒惰放在一切都会“帮助”,但是很吵.性能不应该是一个大问题,因为通常你只想初始化一次语法. def表达式将针对它们被引用的每个点初始化一次.

您可以使用块语法有点聪明并消除“次要”制作的管道:

lazy val addExpr = {
  val add = expr ~ "+" ~ expr
  val sub = expr ~ "-" ~ expr
  add | sub
}
点赞