如何遍历nils数组?

时间:2011-12-30 04:45:35

标签: ruby iteration null

我正在尝试设置一个包含所有nil值的数组,以便有人可以迭代每个值的序列,直到它到达结尾,然后显示更改的数组。

class Big
  def ben
    x = [nil,1,nil,2]
    y = 0
    x[y] == nil ? "good": "bad"
    y += 1
    puts x
  end
end

我知道这可以简化。有没有办法覆盖数组中的每个值?

2 个答案:

答案 0 :(得分:1)

如果我理解你,你可以这样做:

class Big 
  def ben
    x = [nil,1,nil,2]
    # These lines don't do much
    # y = 0
    # x[y] == nil ? "good": "bad"
    # y += 1
    puts x
  end
end

对你的第二个问题是肯定的:fill。例如:

[1, 2, 3].fill(0) # => [0, 0, 0]

答案 1 :(得分:1)

根据我在示例代码中看到的内容,以下是一些可能有用的内容。

这是一种创建数组的简单方法,如果您希望它具有填充nil值的特定大小:

foo = [nil] * 5
=> [nil, nil, nil, nil, nil]

如果要交织两个数组,例如nils数组和另一个数组:

TOTAL_ELEMENTS = 5

([nil] * TOTAL_ELEMENTS).zip((1..TOTAL_ELEMENTS).to_a).flatten
=> [nil, 1, nil, 2, nil, 3, nil, 4, nil, 5]

根据下面的OP评论,这是一个井字游戏,这里有一些创建x的方法:

Array.new(9)
[nil] * 9

两者都返回:

=> [nil, nil, nil, nil, nil, nil, nil, nil, nil]

如果从0开始接收单元格坐标作为偏移量,那么这很有用。

对于tic-tac-toe网格,如果将单元格坐标作为行/列对,则包含三列三列可能更有用:

Array.new(3) { Array.new(3) }
[[nil] * 3] * 3

返回:

=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]

还有一些值得冥想的事情:

ROWS = COLUMNS = 3

x = Array.new( ROWS * COLUMNS )            # for offsets
x = Array.new(ROWS) { Array.new(COLUMNS) } # for rows and columns

如果您将您的位置作为偏移但想要将其转换为行/列, 使用divmod。您的偏移量将为0..8,转换为适合3x3网格, 即[0..2][0..2]。转换也很容易:

def row_col_to_offset(x,y)
  x * ROW + y
end  
>> row_col_to_offset(0,0) # => 0
>> row_col_to_offset(0,1) # => 1
>> row_col_to_offset(1,1) # => 4
>> row_col_to_offset(2,2) # => 8

def offset_to_row_col(o)
  o.divmod(ROW)
end  
>> offset_to_row_col(0) # => [0, 0]
>> offset_to_row_col(1) # => [0, 1]
>> offset_to_row_col(4) # => [1, 1]
>> offset_to_row_col(8) # => [2, 2]

现在您需要了解Ruby的@实例变量以及initialize方法的正确使用。