Kotlin切换lemonadeState时lemonSize值未跨状态传递问题
问题根因
你遇到的变量值无法跨状态传递是两个代码错误共同导致的:
- 变量作用域遮蔽:你在
SELECT分支内写了var lemonSize = LemonTree(),用var重新声明了一个和类层级成员变量同名的局部变量,这个局部变量仅在SELECT对应的代码块内生效,完全没有修改类开头定义的初始值为-1的全局lemonSize。切换到SQUEEZE状态时,代码访问的始终是未被修改的全局lemonSize,自然读不到你在SELECT阶段生成的值。 - 方法调用错误:
LemonTree()是直接创建LemonTree类的实例对象,你没有调用实例的pick()方法获取2-4区间的随机挤压次数,这一点从日志里打印的lemonSize = com.example.lemonade.LemonTree@5c31497就能验证——这串字符是LemonTree实例的内存地址,根本不是你需要的整数数值。 - 额外说明:日志开头的
Failed to initialize 101010-2 format是Android模拟器的OpenGL渲染通用警告,和本次业务逻辑bug无关,不需要处理。
修复方案
直接修改SELECT分支内的错误赋值逻辑即可,修正后的代码段如下:
SELECT -> { Log.d(TAG, "lemonadeState at beginning of SELECT *should be SELECT* lemonadeState = $lemonadeState") // 1. 去掉前面的var,不要声明新的局部变量,直接给类成员lemonSize赋值 // 2. 复用类里已经初始化好的lemonTree实例,调用pick()方法获取随机大小值 lemonSize = lemonTree.pick() Log.d(TAG, "randomly generated lemonSize using LemonTree -> lemonSize = $lemonSize") // Setting the squeezeCount (the number of times the user has squeezed the lemon) to 0. squeezeCount = 0 Log.d(TAG, " setting squeezeCount to 0 -> squeezeCount = $squeezeCount") // Transition to the SQUEEZE state lemonadeState = SQUEEZE Log.d(TAG, "lemonadeState at bottom of SELECT *should be SQUEEZE* lemonadeState = $lemonadeState") }
修改后重新运行,SQUEEZE状态就能正常读取到2-4之间的lemonSize值,后续挤压计数逻辑也能正常执行。
内容的提问来源于stack exchange,提问作者Moya.A
相关产品推荐
相关产品推荐

