是否有用于从数组中的所有元素中减去的ruby函数?
[2,4,7,8,9] - 8 = [-6,-4,-1,0,1]
这不起作用,但我宁愿不用更复杂的情况来做这件事。
[2,4,7,8,9] - [8,8,8,8,8] = [-6,-4,-1,0,1]
答案 0 :(得分:15)
您想要map
,它允许您将变换应用于Enumerable的每个元素,并返回结果数组:
[2,4,7,8,9].map { |i| i - 8 } # => [-6, -4, -1, 0, 1]
顺便说一句,你的第二个例子肯定是不以这种方式工作:
[2,4,7,8,9] - [8,8,8,8,8] = [-6,-4,-1,0,1]
减法从第一个数组中删除第二个数组中的项目,产生[2,4,7,9]
,不您期望的[-6,-4,-1,0,1]
。
答案 1 :(得分:3)
值得一提的是narray
gem作为使用Ruby内置Array
和.map
的替代方法。如果你的数字数组比你的例子大得多,那么narray
被优化为对它们进行数学运算,并且也可以按照你最初的建议工作:
> require 'narray'
=> true
> a = NArray[10,9,8,2,3]
=> NArray.int(5):
[ 10, 9, 8, 2, 3 ]
> a - 8
=> NArray.int(5):
[ 2, 1, 0, -6, -5 ]
答案 2 :(得分:1)
这就是地图/收集的内容(是的,它们都完全相同,因为历史原因收集它们)。
[1,2,3,4,5].map do |elem|
elem - 1
end
或使用collect和替代的do / end语法(在map中也有效)
[1,2,3,4,5].collect { |elem| elem - 1 }
都返回
=> [0, 1, 2, 3, 4]
答案 3 :(得分:0)
class Array
def to_proc
proc { |receiver| receiver.send *self }
end
end
[2,4,7,8,9].map &[:-, 8] #=> [-6,-4,-1,0,1]
答案 4 :(得分:0)
您可以按照以下方式使用任何地图或收集方法。
[2,4,7,8,9].collect {|e| e-8}
=> [-6, -4, -1, 0, 1]
[2,4,7,8,9].map {|e| e-8}
=> [-6, -4, -1, 0, 1]
答案 5 :(得分:0)
如果您正在使用JRuby,那么您可以尝试具有与NArray类似功能的MDArray。但是没有太多的文档。
答案 6 :(得分:-2)
您可以在第二种情况下使用外部迭代器。试试这个:
ary = [8,8,8,8,8].each
[2,4,7,8,9].map{ |e| e - ary.next } # => [-6,-4,-1,0,1]