Ruby 2D数组转置 - 变量无法按预期工作

时间:2014-02-25 23:42:25

标签: ruby arrays scope transpose

您好我是Ruby新手,可以使用以下代码的帮助。

这应该转换一个二维数组。首先,我知道使用my_array.transpose将完成与整个方法相同的事情。这对我来说是一次学习练习,因为我不知道为什么我的代码正在做它的工作。

同样,这应该转置一个二维数组。它实际上做的是创建一个具有正确数量的嵌套数组(行)的数组,但它们都是空的。

此外,我的方法似乎正在改变我不希望它做的my_array的值。看起来我的变量出了问题,我已经测试了代码,new_row确实包含正确的期望值,因为它经历了循环 - 但不知何故,当我调用new_row.clear时,它也会擦除new_array内的值。

编辑 - 澄清我的意思是转置,给定下面代码中的数组,转置数组应该是:
    [
    [0,4,8]
    [1,5,9]
    [2,6,10]
    [3,7,11]
    ]

def my_transpose(inital_array)
  new_row = []
  new_array = []
  new_row_start = 0
  indexer = 0

  row_count = inital_array.count
  inital_array.flatten!
  col_count = inital_array.count / row_count

  col_count.times do 
    row_count.times do 
      new_row<<inital_array[indexer]
      indexer += col_count
    end
    new_array<<new_row
    new_row_start += 1
    indexer = new_row_start
    new_row.clear
  end
  return new_array
end

my_array = [
  [0,1,2,3],
  [4,5,6,7],
  [8,9,10,11]
]
new_array = my_transpose(my_array)
print "old array:"
print my_array.inspect
puts
print "new array:"
puts new_array.inspect

2 个答案:

答案 0 :(得分:1)

你的问题很清楚。您正在清除刚刚创建的阵列。所以你失去了你的工作。

你想要的而不是clear实际上是用以下方法创建一个新数组:

new_row = []

关于你为什么要更改my_array是因为你正在使用bang方法。 flatten!。大多数时候以!结尾的所有方法都是可变方法。也就是说,他们改变你所称的对象。因此,使用它们时需要小心。

这是一个解决方法。只需指定返回新对象的正常flatten的结果。

inital_array = inital_array.flatten

答案 1 :(得分:0)

Ruby中的大多数对象都是通过引用存储的 - 包括数组。在您的情况下,您正在将new_row附加到new_array,以正确存储行值。然后,您正在清除new_row。由于new_array具有对同一对象的引用,因此该行也会在new_array中清除。

dup添加到new_array时,使用new_array << new_row.dup 创建新的数组对象:

initial_array.flatten!

当您致电flatten!时,会发生同样的行为。 my_array方法修改接收器并更新函数外部{{1}}引用的相同数组。