blo*_*lob 0 ruby arrays multidimensional-array
我有以下代码
class Room
attr_reader :content, :descr
def initialize
@content = get_content
@descr = get_description
end
def get_content
['errors', 'bugs', 'syntax problems'].sample
end
def get_description
"This room has #{self.content}"
end
end
@rooms = Array.new(3, Array.new(3))
@rooms[1][1] ||= Room.new
# => #<Room:0x68985d8 @content="errors", @descr="This room has errors">
p @rooms # =>
#[[nil, #<Room:0x68985d8 @content="errors", @descr="This room has errors">, nil],
# [nil, #<Room:0x68985d8 @content="errors", @descr="This room has errors">, nil],
# [nil, #<Room:0x68985d8 @content="errors", @descr="This room has errors">, nil]]
@rooms = Array.new(3, Array.new(3))
@rooms[1][2] ||= Room.new
# => #<Room:0x6aaab58 @content="bugs", @description="This room contains bugs">
p @rooms # =>
#[[nil, nil, #<Room:0x6aaab58 @content="bugs", @descr="This room has bugs">],
# [nil, nil, #<Room:0x6aaab58 @content="bugs", @descr="This room has bugs">],
# [nil, nil, #<Room:0x6aaab58 @content="bugs", @descr="This room has bugs">]]
Run Code Online (Sandbox Code Playgroud)
它应该Room在一个地方创建一个新实例(如果它还不存在),而不是一次在整个列中创建.相反,在创造称实例[1][1]或其他地方,它被设置[0][2],[1][2]和[2][2].
为什么会这样?如何更改它才能正常工作?
我最近在这方面挣扎,你必须改变这一行@rooms = Array.new(3, Array.new(3)):
@rooms = Array.new(3) { Array.new(3) }
Run Code Online (Sandbox Code Playgroud)
前者发生的是参数Array.new(3)被评估并创建一个包含3个元素的新数组(我将其称之为a).然后,Array.new(3, a)创建一个包含3个元素的新数组,所有元素都包含a.
并且a是一个可变对象,因此当您为一列修改它时,所有列都会被修改.
在解决方案中,{ Array.new(3) }为每个元素评估块,这就是为什么每列都是不同的数组.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |