二维数组,如何创建修改原始数组的列数组



我有一个二维数组,我希望能够使用另一个数组来引用原始数组的列。我可以处理行,但我不知道如何处理列。

twodim = [[" "," "," "], [" "," "," "], [" "," "," "]]
row1 = twodim[0]
row1[0] = "X"
col1 = << twodim[0][0] << twodim[1][0] << twodim[2][0]
col1[2] = "X"
=> puts twodim
#actual result
=> [["X", " ", " "], [" ", " ", " "], [" ", " ", " "]]
#desired result
=> [["X", " ", " "], [" ", " ", " "], ["X", " ", " "]]

我试过使用地图!但这最终导致原来的twodim数组改变,当我只是试图将列分配给变量。我也试过转置,但那会返回一个新数组。是否有一种方法来创建一个数组使用对象id从原始数组,以便能够修改它?这是一个挠痒痒的程序,我正在为它编写ai。我试着检查在给定的行或列中是否存在获胜的方法,然后让它填充获胜位置(如果存在)。如果有帮助的话,下面是剩下的部分:

    rows = [row1, row2, row3]
    cols = [col1, col2, col3]
    rows.map do |row|
        if !row.include?(@player) && row.count(@ai) == 2 then
            row.fill(@ai)
            return
        end
    end
    cols.each do |col|
        if !col.include?(@player) && col.count(@ai) == 2 then
            col.fill(@ai)
            puts "col = #{col}"
            return
        end
    end

使用String#replace

twodim = [[" "," "," "], [" "," "," "], [" "," "," "]]
row1 = twodim[0]
row1[0] = "X"
col1 = [twodim[0][0], twodim[1][0], twodim[2][0]]
col1[2].replace("X")
twodim
# => [["X", " ", " "], [" ", " ", " "], ["X", " ", " "]] 

解释:

在您的示例中,当执行col1[2] = "X"时,您将为对象col1[2]分配一个值为"X"的新变量,这意味着col1[2]现在存储新对象"X"的引用。但是,当执行col1[2].replace("X")时,replace方法正在更改col12引用的对象的内容。

下面的例子将澄清上述解释:

$> col1[1].object_id
# => 2161281980 
$> col1[1] = "X"
# => "X" 
$> col1[1].object_id # Different object_id !!!
# => 2161469100
$> col1[1].replace("X")
# => "X" 
$> col1[1].object_id
# => 2161469100 # Same object_id !!!

我还建议你阅读这篇文章: Ruby是通过引用传递还是通过值传递?

最新更新