【发布时间】:2021-07-29 23:51:41
【问题描述】:
Game 有一个包含十个 Frame 实例的数组
class Frame
attr_accessor :rolls
def initialize
@rolls = ""
end
end
class Game
attr_accessor :frames
def initialize
@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
game = Game.new
rolls = [5, 5, 3, 7, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2]
curr = 0
rolls.each_with_index do |roll|
game.frames[curr].rolls << roll.to_s
if game.frames[curr].rolls.size == 2
curr += 1
end
end
p "Total rolls: #{rolls.size}"
p game.print_frames
我希望打印 10 行,每行都有一个带有 2 个数字的字符串的框架 ID 但是,返回以下内容
"Total rolls: 20"
"Frame #1: 55374000000000000022"
"Frame #2: 55374000000000000022"
"Frame #3: 55374000000000000022"
"Frame #4: 55374000000000000022"
"Frame #5: 55374000000000000022"
"Frame #6: 55374000000000000022"
"Frame #7: 55374000000000000022"
"Frame #8: 55374000000000000022"
"Frame #9: 55374000000000000022"
"Frame #10: 55374000000000000022"
[#<Frame:0x0000565402e40528 @rolls="55374000000000000022">, #<Frame:0x0000565402e40528 @rolls="55374000000000000022">, #<Frame:0x0000565402e40528 @rolls="55374000000000000022">, #<Frame:0x0000565402e40528 @rolls="55374000000000000022">, #<Frame:0x0000565402e40528 @rolls="55374000000000000022">, #<Frame:0x0000565402e40528 @rolls="55374000000000000022">, #<Frame:0x0000565402e40528 @rolls="55374000000000000022">, #<Frame:0x0000565402e40528 @rolls="55374000000000000022">, #<Frame:0x0000565402e40528 @rolls="55374000000000000022">, #<Frame:0x0000565402e40528 @rolls="55374000000000000022">]
实例变量的作用类似于帧之间共享的类变量。所有 20 个卷号都是串联的,而不是每个帧都拥有一对。
代码有什么问题?是因为Game 或Frame 对象没有正确实例化吗?
【问题讨论】:
-
改用
@frames = Array.new(10) { Frame.new }。 -
提示:当得到这样奇怪的结果时,用
p @frames.map(&:object_id)做一点调试,看看你是否有一个相同的对象引用数组,或者不同的。
标签: ruby oop instantiation instance-variables class-variables