2013-07-04 59 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相似的功能。儘管沒有太多的文檔。