在約RegexParsers的Scaladoc,有下面的代碼:爲什麼RegexParsers用「def」而不是「lazy val」來定義?
object Calculator extends RegexParsers {
def number: Parser[Double] = """\d+(\.\d*)?""".r ^^ { _.toDouble }
def factor: Parser[Double] = number | "(" ~> expr <~ ")"
...
我不明白爲什麼我們把它與一個def
書面和不與val
或lazy val
?我會這樣寫:
object Calculator extends RegexParsers {
lazy val number: Parser[Double] = """\d+(\.\d*)?""".r ^^ { _.toDouble }
lazy val factor: Parser[Double] = number | "(" ~> expr <~ ")"
...
def定義的開銷要小得多,因爲它們被編譯到通常的方法調用中,而懶惰的vals已經在下面檢查了初始化和bitset字段。 –
但是'def'意味着每次都會重新創建正則表達式。難道這不會導致一些性能損失? – n1r3
避免過早優化。此外,不要指望Scaladoc中的代碼示例可以隨時複製到您的生產應用程序中而無需修改! –