我正在尝试设置一个包含所有nil值的数组,以便有人可以迭代每个值的序列,直到它到达结尾,然后显示更改的数组。
class Big
def ben
x = [nil,1,nil,2]
y = 0
x[y] == nil ? "good": "bad"
y += 1
puts x
end
end
我知道这可以简化。有没有办法覆盖数组中的每个值?
答案 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
方法的正确使用。