2013-07-04 55 views
0

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

回答

14

你想map,它可以让你应用转变为可枚举的每个元素,返回结果数组:

[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]

-2

您可以对第二种情况使用外部迭代器。试试这个:

ary = [8,8,8,8,8].each 
[2,4,7,8,9].map{ |e| e - ary.next } # => [-6,-4,-1,0,1] 
+0

仅当您需要从数组中的每个元素中减去不同的数字时才有用。 – bronislav

3

值得一提的narray宝石作为替代使用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 ] 
1

这就是图/收集是(是的,他们都做完全同样,收集是出于历史原因)。

[1,2,3,4,5].map do |elem| 
    elem - 1 
end 

或使用收集并替代办/结束语法(在地图中同样有效)

[1,2,3,4,5].collect { |elem| elem - 1 } 

都返回

=> [0, 1, 2, 3, 4] 
+1

你的第二个例子是没有使用“lambda”而不是“block”,你的代码的两个版本都使用了procs。 '{}'是'do/end'的替代语法,它们是相同的。 – meagar

+0

谢谢,编辑 - – bluehallu

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] 
+0

鲍里斯 - 你的意见请:) :) –

+1

@Priti:我认为你变得比我更好''Benchmark'用户,但你有标签转换:-)))让我试试在我的机器上。 OMG! –

+1

OMG!我的错误...... :) –

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] 
0

如果您使用JRuby,那么您可以尝试MDArray,它具有与NArray相似的功能。尽管没有太多的文档。