【问题标题】:How do I iterate through an array of nils?如何遍历 nils 数组?
【发布时间】:2011-12-30 04:45:35
【问题描述】:

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

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

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

【问题讨论】:

  • 您的代码示例不完整。请说明您是如何调用ben 方法的,以及预期的输出是什么。就目前而言,它看起来像是一个非常人为的例子,没有做任何事情。
  • 你说的很对。我忘了调用该方法,因为它不完整。很抱歉给出不完整的代码。它应该调用 Big.new.ben 是我所说的。

标签: ruby iteration null


【解决方案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]

【讨论】:

  • 最好解释一下为什么可以注释掉ben 方法中的中间行。 OP 可能不明白为什么。
【解决方案2】:

根据我在示例代码中看到的内容,这里有一些可能会有所帮助的事情。

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

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

如果你想交织两个数组,比如一个 nil 数组和另一个带值的数组:

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 开始的偏移量,这将非常有用。

对于井字游戏网格,如果您将单元格坐标作为行/列对获取,则三行三列可能会更有用:

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方法的正确使用。

【讨论】:

  • 我发现[nil] * 5,一种特殊的Array.new(5)的做法,但结果是一样的……
  • 也许我有点不清楚我想要得到什么。我正在做一个井字游戏,其中用户将从数组 0..8 `x= [nil,nil,nil]` 中选择一个数字,然后用户 1 选择 0 x = [nil, "X", nil] 然后用户 2 选择 2 x = [nil, "x", "O"]
  • 你必须使用一个包含九个元素的数组,还是可以使用三个包含三个元素的数组,即x[0..2][0..2]
  • @Thrillr,我添加了一些可能有用的东西。
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 2018-10-05
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 2023-01-29
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多