如何执行val的多步骤初始化

Jus*_*mer 3 kotlin

为了学习一点,kotlin我正在松散地在经典的Monadic Parser Combinators 上构建一个解析器组合库.

在我的情况下,由于递归语法,我需要转发声明一个解析器.在准备最终表达式解析器时,我需要更新前向声明

我的第一次尝试是这样的

val addLike             = mulLike separatedBy addLikeSeparator
val expression          = 
  forwarded.second(addLike)
  addLike
Run Code Online (Sandbox Code Playgroud)

这个想法是执行一个简短的addLike初始化然后返回初始化值.当我进行一些F#编程时,这是一种非常常见的模式,我认为这是一个很好的模式,因为它简化了隐藏初始化细节.

kotlin但是,这不起作用:

Error:(195, 5) Kotlin: Expecting a top level declaration
Run Code Online (Sandbox Code Playgroud)

这种方法也失败了:

val addLike             = mulLike separatedBy addLikeSeparator
val expression          = forwarded.second(addLike); addLike
Run Code Online (Sandbox Code Playgroud)

问题似乎是;将两者结合expressions成一个statement.

所以我试着,希望它的行为有点像C/C++,但没有运气:

val addLike             = mulLike separatedBy addLikeSeparator
val expression          = forwarded.second(addLike), addLike
Run Code Online (Sandbox Code Playgroud)

阅读kotlin规范后,我发现没有明确的解决方案,这就是我转向StackOverflow的原因.这种模式可以用惯用的方式实现kotlin吗?

更新

@Eric建议使用run,如果我更新我的代码,最终解决方案最终有点像这样:

val expression          = run () {
                                forwarded.second(addLike)
                                whitespaces keepRight addLike keepLeft expectEOS()
                          }
Run Code Online (Sandbox Code Playgroud)

这对我来说是可以接受的.谢谢@Eric.

Ale*_*lov 8

您可以使用apply标准库中的功能.它在其接收器上执行操作,然后返回它:

val expression = addLike.apply { forwarded.second(this) }
Run Code Online (Sandbox Code Playgroud)

  • 澄清一下,返回的"它"是接收者,而不是操作:) (3认同)