地图!没有改变原始数组

时间:2015-02-03 18:15:29

标签: ruby

@key包含四个不同的三位整数的数组。 someArray有大约十位三位数的整数。我有一个方法,有一个我试图修改的数组。我正在使用map!来完成此任务:

def multiply()
  count = 0
  @someArray.map! do |map|
    if @key[count]
      map = map * @key[count]
      count = count + 1
    else
      count = 0
      map = map * @key[count]
      count = 1
    end
  end
  print @someArray
end

我收到了一些意想不到的结果。这打印[1,2,3,4,1,2,3,4,1,2,3,4,1,2]。为什么不打印map * @key值而不是计数?

1 个答案:

答案 0 :(得分:2)

.map使用块中的返回值。您的返回值为count = 1count = count + 1

你不能指定超过块的输入变量,这绝对没有效果。

正确地写了,你的块看起来像这样:

@someArray.map! do |i|
  if @key[count]
    i *= @key[count]
    count = count + 1
  else
    i *= @key[0]
    count = 1
  end
  i
end

顺便说一句,这对map的使用略显不合适。结合两个数组的元素有更好的方法,即使其中一个数组更短。

给出两个输入:

someArray = [1,2,3,4,5,6,7,8,9,0]
key = [2,4,6]

您可以将这两个数组合并为一个数组,使用.cycle生成一个枚举器,它将环绕,以便两个数组在功能上具有相同的长度:

pairs = someArray.zip(key.cycle)
# => [[1, 2], [2, 4], [3, 6], [4, 2], [5, 4], [6, 6], [7, 2], [8, 4], [9, 6], [0, 2]]

然后,您可以映射生成的数组,将这些对相乘:

pairs.map { |a,b| a * b }
# => [2, 8, 18, 8, 20, 36, 14, 32, 54, 0]

所以,总的来说,你的方法是:

def multiply()  
  @someArray.zip(@key.cycle).map { |a,b| a * b }
end