Kotlin无法重置变量 class-Sokoban(操场:数组) { 私人游乐场 私人游乐场=游乐场 有趣的动作(d:String){ …/“游乐场”已被修改。 } 乐趣重新启动(){ 操场 } } funmain(args:Array){ val操场:数组=数组( “.toCharArray(), “#$…*…#”。.toCharArray(), “#…@……”。toCharArray(), toCharArray() ) val sokoban=sokoban(playerd.clone()) sokoban.移动(“左”) sokoban.restart() }
调用函数“restart”时,上面的代码预期会重置变量“playway”,但它失败了。改为修改变量“\u playway”。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字段,并且您的重置方法无法访问该字段 我认为您应该知道,您没有遵循
如何解决这个异常问题?这段代码不能像您预期的那样工作,因为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()
}