您好我是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
答案 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}}引用的相同数组。