Ruby中Array.new初始化Frame数组出现实例变量共享异常问题排查
问题原因
你的代码问题出在Game类初始化frames数组的写法上,和Frame类本身的定义无关。
Ruby中Array.new(10, Frame.new)这种语法,只会执行一次Frame.new实例化操作,然后把这同一个Frame实例的引用填充到数组的10个位置里。你看到的10个Frame实例本质上是同一个对象,修改任意一个元素的rolls属性,所有数组元素的对应属性都会同步变化,才会出现所有帧的rolls都是完整20个数字拼接的情况。
修复方案
把数组初始化的写法改成带块的形式即可:
class Game attr_accessor :frames def initialize # 带块的写法会为每个数组位置单独执行一次Frame.new,生成10个独立的Frame实例 @frames = Array.new(10) { Frame.new } end def print_frames @frames.each_with_index do |frame, idx| p "Frame ##{idx+1}: #{frame.rolls}" end end end
修改后运行代码即可得到预期输出,每个Frame的rolls属性仅保存对应2次投球的记录,逐行打印10个帧的独立数据。
内容的提问来源于stack exchange,提问作者Ridhwaan Shakeel
相关产品推荐
相关产品推荐

