You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:24:15