递归Ruby实例方法中神秘的空数组-Ruby 1.8.7

递归Ruby实例方法中神秘的空数组-Ruby 1.8.7,ruby,recursion,instance-variables,Ruby,Recursion,Instance Variables,我正在努力解决递归实例方法中一些奇怪的变量行为。运行Ruby 1.8.7。我这样做是为了学习,我遇到了一些麻烦。如有任何建议,将不胜感激 此代码尝试找出所有不同的方法,您可以使用长度为1英尺、2英尺、3英尺和4英尺的砖块制作一行长度为max_length 实例方法将块添加到行([0],10)将递归地添加不同长度的块,直到将满足总长度标准的所有可能组合放在一起。我试图将所有不同的砖块组合存储在一个实例变量中,@rows,它是一个数组数组,每个数组表示一行中的一系列砖块 一切正常,只是当我查看实例的

我正在努力解决递归实例方法中一些奇怪的变量行为。运行Ruby 1.8.7。我这样做是为了学习,我遇到了一些麻烦。如有任何建议,将不胜感激

此代码尝试找出所有不同的方法,您可以使用长度为1英尺、2英尺、3英尺和4英尺的砖块制作一行长度为
max_length

实例方法
将块添加到行([0],10)
将递归地添加不同长度的块,直到将满足总长度标准的所有可能组合放在一起。我试图将所有不同的砖块组合存储在一个实例变量中,
@rows
,它是一个数组数组,每个数组表示一行中的一系列砖块

一切正常,只是当我查看实例的
变量时,它充满了一堆
[0]
数组。奇怪的是,当我将
@rows.push(row)
更改为
@rows.push(row.to)
时,一切正常。这是怎么回事?当我尝试将行数组放入
@行中时,为什么行数组变为空?下面是这里描述的两个场景的代码和示例输出

class Array; def sum; inject( nil ) { |sum,x| sum ? sum+x : x }; end; end

class Brick
  attr_accessor :rows

  def initialize(rows)
    @rows = rows
  end

  def add_brick_to_row(row,max_length)
    (1..4).each do |n|                                                                                                                                         
      # Add a brick if needed                                                                                                                                      
      if row.sum <= max_length
        row.push(n)
        if row.sum == max_length
          # If the row is complete add it to the rows matrix                                                                                                       
          # BELOW IS THE PROBLEMATIC LINE
          @rows.push(row)
          # EVERYTHING SEEMS TO WORK FINE WHEN I CHANGE row TO A STRING (SEE NEXT LINE)
          # @rows.push(row.to_s)
          print "pushed row: "
          print row.to_s+"\n"
        elsif row.sum < max_length
          # Recurse if more bricks are needed                                                                                                                       
          # print "adding brick\n"                                                                                                                                 
          self.add_brick_to_row(row, max_length)
        end
      end
      row.pop
    end

  end

end
病理病例(我有
@rows.push(row)
):


问题是您正在将对同一
行的多个引用压入

用以下部件更换推压管:

@rows.push(Array.new(row))


这将为每个
行创建一个新的数组实例,应该可以解决您的问题。

谢谢brentvatne!这很有道理。
>> l.add_brick_to_row([0],3)
>> l.rows
=> [0, "0111", "012", "021", "03"]
>> l.add_brick_to_row([0],3)
>> l.rows
=> [[0], [0], [0], [0]]