CodeWorld中activityOf()的state状态能否用列表作为元组元素?
错误原因
你遇到的运行时错误和「列表能不能作为状态元组元素」无关,完全是列表修改逻辑写错导致的:
- 初始状态下
u_list_0 = [u10,u20]是长度为2的列表,此时访问下标1、2都正常 - 你处理上下按键的
change逻辑里,返回的新列表是[u1_of((t, u_list))+1],只有1个元素,按下按键后u_list直接被替换成了长度为1的列表,原有第二个元素u2被直接丢弃 - 当你修改代码打印
u2_of的返回值时,相当于尝试访问长度为1的列表的第2位,自然触发索引越界错误。
关于状态存储列表的说明
CodeWorld的状态元组完全支持将列表作为元素使用,这是合法且实用的写法,你的用法方向没有问题,只需要修正列表修改逻辑即可。
修复方案
修改上下按键对应的状态更新逻辑,构造新列表时保留原有其他元素即可:
-- 写法1:明确保留u2,适合固定长度的列表 change((t, u_list), KeyPress("Up")) = (t, [u1_of((t, u_list)) + 1, u2_of((t, u_list))]) change((t, u_list), KeyPress("Down")) = (t, [u1_of((t, u_list)) - 1, u2_of((t, u_list))]) -- 写法2:通用写法,仅修改第一个元素,剩下的所有元素原样保留,适合长度可变的列表 change((t, u_list), KeyPress("Up")) = (t, [u_list#1 + 1] + drop(1, u_list)) change((t, u_list), KeyPress("Down")) = (t, [u_list#1 - 1] + drop(1, u_list))
另外你代码里t_of((t,u_list))可以直接简化为参数里的t,不需要额外调用取值函数。
内容的提问来源于stack exchange,提问作者janpeter
相关产品推荐
相关产品推荐

