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

Ruby使用Struct结构体数组时修改单个元素所有元素同步变更问题

问题原因

Ruby 中使用 Array.new(size, obj) 语法初始化数组时,会将同一个对象实例重复填充到数组的所有位置。你代码中先创建了一个 Frame 结构体对象存入 frame 变量,再通过 Array.new(11, frame) 生成数组,最终数组内11个元素全部指向这个唯一的Frame对象,共享同一块内存地址。因此修改任意一个元素的属性,本质都是修改同一个对象,所有数组元素的对应属性自然会同步更新。

注:你提供的代码存在笔误,game[0].first = 10 中的 game 应为 frames。

解决方法

改用带块的方式初始化数组,每次执行块内代码都会生成独立的Frame实例:

Frame = Struct.new(:first, :second, :total)
# 正确写法:每个数组位置都生成新的Frame对象
frames = Array.new(11) { Frame.new(1, 2, 3) }

newLine = "\n"
print "frames[0].first: " + frames[0].first.to_s + newLine
print "frames[1].first: " + frames[1].first.to_s + newLine
frames[0].first = 10
print "frames[0].first: " + frames[0].first.to_s + newLine
print "frames[1].first: " + frames[1].first.to_s + newLine
frames[1].first = 20
print "frames[0].first: " + frames[0].first.to_s + newLine
print "frames[1].first: " + frames[1].first.to_s + newLine

修改后运行输出符合预期:

frames[0].first: 1
frames[1].first: 1
frames[0].first: 10
frames[1].first: 1
frames[0].first: 10
frames[1].first: 20

内容的提问来源于stack exchange,提问作者Robert Martens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:02