Ruby从数组中减去一个数字

时间:2013-07-04 14:34:55

标签: ruby-on-rails ruby

是否有用于从数组中的所有元素中减去的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] 

7 个答案:

答案 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]