Kotlin无法重置变量

时间:2018-01-29 07:47:18

标签: kotlin

class Sokoban(Playground: Array<CharArray>)  
{    
    private var playground = Playground    
    private val _Playground = Playground    
    fun move(d: String) {    
        ...//"playground" got modified.         
    }    
    fun restart() {
        playground = _Playground
    }
}

fun main(args: Array<String>) {    
    val Playground: Array<CharArray> = arrayOf(    
            "###########".toCharArray(),    
            "#$...*....#".toCharArray(),    
            "#..@......#".toCharArray(),    
            "###########".toCharArray()    
    )    
    val sokoban = Sokoban(Playground.clone()) 
    sokoban.move("Left")
    sokoban.restart()   
    }

上面的代码预计会重置变量&#34; playground&#34;当功能&#34;重启&#34;被称为,但它失败.Instead变量&#34; _Playground&#34;被修改了。 如何解决这个异常问题?

2 个答案:

答案 0 :(得分:0)

此代码无法正常工作,因为Java,因此,Kotlin使用引用,而不是对象。因此,您的变量_Playground只是对变量playground的引用。如果您希望它按预期工作 - 请_Playground填充Playground变量。

此外,您的代码无法编译,因为您未将Playground作为字段传递,而您的reset方法无法访问该字段。

我认为您应该知道您没有遵循java / kotlin的样式指南。通常,变量应在camelcase中命名,并从小写字母开始。

答案 1 :(得分:0)

正如其他人所提到的,您的代码不遵循编码约定,并且有参考和其他问题。但是学习一门新语言并不容易。这是一个有效的解决方案(添加了print()以显示结果并允许我确认结果;)

我定义了'move'来将第一个元素设置为传递的字符串。

这为Sokoban创建了一个名为playground的可修改的私有属性。必须是可修改的(var)才能重新启动。

内部属性_playground采用克隆,以便以后可以恢复。

还整理了物品的名称。希望这有助于您学习Kotlin的旅程。

class Sokoban(private var playground: Array<CharArray>) {
    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<String>) {
    val playground: Array<CharArray> = arrayOf(
        "###########".toCharArray(),
        "#$...*....#".toCharArray(),
        "#..@......#".toCharArray(),
        "###########".toCharArray()
    )
    val sokoban = Sokoban(playground)
    sokoban.move("Left")
    sokoban.print()
    sokoban.restart()
    sokoban.print()
}