Kotlin无法重置变量 class-Sokoban(操场:数组) { 私人游乐场 私人游乐场=游乐场 有趣的动作(d:String){ …/“游乐场”已被修改。 } 乐趣重新启动(){ 操场 } } funmain(args:Array){ val操场:数组=数组( “.toCharArray(), “#$…*…#”。.toCharArray(), “#…@……”。toCharArray(), toCharArray() ) val sokoban=sokoban(playerd.clone()) sokoban.移动(“左”) sokoban.restart() }

Kotlin无法重置变量 class-Sokoban(操场:数组) { 私人游乐场 私人游乐场=游乐场 有趣的动作(d:String){ …/“游乐场”已被修改。 } 乐趣重新启动(){ 操场 } } funmain(args:Array){ val操场:数组=数组( “.toCharArray(), “#$…*…#”。.toCharArray(), “#…@……”。toCharArray(), toCharArray() ) val sokoban=sokoban(playerd.clone()) sokoban.移动(“左”) sokoban.restart() },kotlin,Kotlin,调用函数“restart”时,上面的代码预期会重置变量“playway”,但它失败了。改为修改变量“\u playway”。 如何解决这个异常问题?这段代码不能像您预期的那样工作,因为Java,以及Kotlin使用的是引用,而不是对象。因此,您的变量\u playway只是对变量playway的引用。如果您希望它按预期工作,请将\u playway设置为playway变量的克隆 另外,您的代码不会编译,因为您没有将字段传递给as字段,并且您的重置方法无法访问该字段 我认为您应该知道,您没有遵循

调用函数“restart”时,上面的代码预期会重置变量“playway”,但它失败了。改为修改变量“\u playway”。
如何解决这个异常问题?

这段代码不能像您预期的那样工作,因为Java,以及Kotlin使用的是引用,而不是对象。因此,您的变量
\u playway
只是对变量
playway
的引用。如果您希望它按预期工作,请将
\u playway
设置为
playway
变量的克隆

另外,您的代码不会编译,因为您没有将
字段传递给
as字段,并且您的
重置
方法无法访问该字段



我认为您应该知道,您没有遵循java/kotlin的样式指南。通常情况下,变量的名称应以小写字母命名。

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

我定义了“move”,将第一个元素设置为传递的字符串

这将创建Sokoban,其中包含一个可修改的私有财产,称为游乐场。必须是可修改的(var),以便可以重新启动

内部属性_playway接受克隆,以便以后可以恢复

还整理了物品名称。希望这对你学习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()   
    }
class-Sokoban(私有变量:数组){
private val_playerd=playerd.clone()
有趣的动作(d:弦乐){
操场[0]=d.toCharArray()
}
乐趣重新启动(){
操场
}
趣味印刷品(){
println(“当前值”)
playerd.forEach{println(it)}
}
}
趣味主线(args:Array){
val:Array=arrayOf(
“.toCharArray(),
“#$…*…#”。.toCharArray(),
“#…@……”。toCharArray(),
toCharArray()
)
瓦尔索科班=索科班(游乐场)
sokoban.移动(“左”)
sokoban.print()
sokoban.restart()
sokoban.print()
}

首先,此代码甚至不编译。其次,变量
\u
当然没有被修改,因为它是
val
,您可能是说它引用的对象被修改了。当然,这是您的代码的预期结果。感谢您的回答。但是…它成功地完成了compline,并且使用了一个克隆似乎…不起作用。class Sokoban(playway:Array){private var playway=playway private val\u playway=playway fun move(d:String){…/“playway”被修改。}fun restart()(5)操场:数组)数组数组(数组)数组(数组)数组)数组(数组)数组(数组)数组(数组)数组(数组)数组(Arraof of(((3)5)运动场:操场:操场(操场)操场(7)操场(7)运动场(7)操场(7)操场(7)操场(7)操场(7)操场(7)操场(7)操场(7)操场(7)操场(7)操场(7)7)操场(7)7)运动场(7)运动场(7)操场(7)操场(7)运动场(7)7)7)游戏(7)7)7)游戏(7)7)游戏(7)游戏(7)的主要(7)游戏(7)游戏场(7)运动场(7)7)运动场(7)7)操场(7)7)7)7)7)7)游戏(7)游戏场(7)7)游戏(##“.toCharArray())val sokoban=sokoban(playway.clone())sokoban.move(“Left”)sokoban.restart()}@Dzx您的游乐场变量仍然不可用field@Dzx仍然不是
Sokoban
类的字段。
\u playway
仍然不是
playway
的克隆,当修改playway的一个字符时,它似乎无法正常工作。如果我将playway[0]=d.tocharray()替换为playway[0][0]='@,它将不会被重置。
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()
}