在Ruby中将n维数组的每个元素乘以一个数字

7
在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?
使得: [1,2,3,4,5].multiplied_by 2 == [2,4,6,8,10][[1,2,3],[1,2,3]].multiplied_by 2 == [[2,4,6],[2,4,6]]?
(显然我编写了multiplied_by函数来区分它与*,后者似乎连接数组的多个副本,这不是我需要的)。
谢谢!

1
二维数组字面量应该写成 [[1, 2, 3], [1, 2, 3]] 的形式。不幸的是,6 个字符的限制不允许我进行更正。 - undur_gongor
好的,谢谢提醒。显然这个限制对我不适用,所以我已经更改了它。 - Russell
3个回答

8
这句话的长形式为:
[ 1, 2, 3, 4, 5 ].collect { |n| n * 2 }

这并不是很复杂。您可以将您的multiply_by方法改为:

class Array
  def multiply_by(x)
    collect { |n| n * x }
  end
end

如果你想要进行递归乘法运算,你需要将其作为特殊情况处理:

class Array
  def multiply_by(x)
    collect do |v|
      case(v)
      when Array
        # If this item in the Array is an Array,
        # then apply the same method to it.
        v.multiply_by(x)
      else
        v * x
      end
    end
  end
end

谢谢。我想这回答了我的问题 - 没有“现成”的方法来做到这一点。虽然它很简单,但如果有内置函数,我总是更愿意使用它。没有必要重新发明轮子 - 可能会把它弄坏。 - Russell
是的,这种事情没有内置方法,但好消息是鼓励向核心类添加补丁,只要您不会破坏现有的补丁。为了小心起见,在添加方法之前,您应该始终检查它是否已定义,如果已经存在,则可能会发出警告。 - tadman

3
使用ruby标准库中的Matrix类如何?
irb(main):001:0> require 'matrix'
=> true
irb(main):002:0> m = Matrix[[1,2,3],[1,2,3]]
=> Matrix[[1, 2, 3], [1, 2, 3]]
irb(main):003:0> m*2
=> Matrix[[2, 4, 6], [2, 4, 6]]
irb(main):004:0> (m*3).to_a
=> [[3, 6, 9], [3, 6, 9]]

1

多维数组似乎无法正常工作。我有什么遗漏吗? - Russell
不,它不会。但是使用地图有什么问题吗?显式通常比隐式更好。 - tokland
地图本身没有问题。但是数据来自另一个(第三方)应用程序,所以我无法控制其结构。考虑到操作非常简单,我认为可以在当前状态下完成它,并避免将其转换为地图,只为执行单个操作然后再次转换回来的开销。 - Russell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接