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
相关产品推荐
相关产品推荐

