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成为Playgroundvariables的一个隐藏点。

此外,您的代码不会编译,因为您不通过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() }