我知道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
}