Kotlin无法重置variables
class Sokoban(Playground: Array) { private var playground = Playground private val _Playground = Playground fun move(d: String) { ...//"playground" got modified. } fun restart() { playground = _Playground } } fun main(args: Array) { val Playground: Array = arrayOf( "###########".toCharArray(), "#$...*....#".toCharArray(), "#..@......#".toCharArray(), "###########".toCharArray() ) val sokoban = Sokoban(Playground.clone()) sokoban.move("Left") sokoban.restart() }
当调用函数“restart”时,上面的代码被期望重置variables“playground”,但是失败。相反,variables“_Playground”被修改。 如何解决这个不正常的问题?
此代码不能按预期工作,因为Java,因此,Kotlin使用引用,而不是对象。 所以你的variables_Playground
只是对你的variablesplayground
的引用。 如果你想让它像你期望的那样工作 – 让_Playground
成为Playground
variables的一个隐藏点。
此外,您的代码不会编译,因为您不通过Playground
作为领域,您的reset
方法无法访问它。
我认为你应该知道你不遵循java / kotlin的风格指南。 通常variables应该在camelcase中命名,并从小写字母开始。
正如其他人所提到的,你的代码并不遵循编码约定,并且有引用和其他问题。 但是学习一门新的语言并不总是那么容易。 这里有一个解决方案(用一个附加的print()来显示结果并让我确认结果;)
我定义“移动”将第一个元素设置为传递的字符串。
这创造了一个可改变,私人财产称为操场的推箱子。 必须是可修改的(var)才能重新启动。
内部属性_playground需要一个克隆,以便稍后可以恢复。
还整理了项目的名字。 希望这有助于你学习Kotlin的旅程。
class Sokoban(private var playground: Array) { private val _playground = playground.clone() fun move(d: String) { playground[0] = d.toCharArray() } fun restart() { playground = _playground } fun print() { println("Current value") playground.forEach { println(it) } } } fun main(args: Array) { val playground: Array = arrayOf( "###########".toCharArray(), "#$...*....#".toCharArray(), "#..@......#".toCharArray(), "###########".toCharArray() ) val sokoban = Sokoban(playground) sokoban.move("Left") sokoban.print() sokoban.restart() sokoban.print() }