2015-09-02 104 views
1

在下面的代碼中,arr意味着是一個二維數組,例如[[1,2],[4,5]]。它計算子數組元素的總和。子數組只能有一個元素,在這種情況下,總和就是一個元素。爲什麼我不能使用| a,b |而不是|(a,b)|在arr.map {|(a,b)|中!b.nil? ? a + b:a}?

def compute(arr) 
    return nil unless arr 
    arr.map { |(a, b)| !b.nil? ? a + b : a } 
end 

爲什麼代碼必須|(a, b)|而不是|a,b|(a,b)在Ruby中的含義是什麼?

回答

2

兩者都是等價的,如果是arr一個數組:

arr = [[1, 2], [4, 5]] 
arr.map { |a, b| [a, b] } #=> [[1, 2], [4, 5]] 
arr.map { |(a, b)| [a, b] } #=> [[1, 2], [4, 5]] 

這是因爲塊被調用一個參數一次:子陣列。喜歡的東西:

yield [1, 2] 
yield [4, 5] 

如果超過一個參數是產生這種變化。例如,each_with_index用兩個參數調用塊:項目(即子陣列)及其索引。喜歡的東西:

yield [1, 2], 0 
yield [4, 5], 1 

的區別是顯而易見的:

enum = [[1, 2], [4, 5]].each_with_index 
enum.map { |a, b| [a, b] } #=> [[[1, 2], 0], [[4, 5], 1]] 
enum.map { |(a, b)| [a, b] } #=> [[1, 2], [4, 5]] 

注意,忽略圓括號,您還可以設置默認參數值:

arr = [[1, 2], [4]] 
arr.map { |a, b = 0| a + b } #=> [3, 4] 
5

您也可以使用|a,b|,這與|(a,b)|沒什麼區別。

您也可以改寫爲下面的代碼,其不具有用於子陣列的元件數限制:

arr.map { |a| a.inject{ |sum,x| sum + x } } 

甚至:

arr.map { |a| a.inject(:+) } 
+0

更地道寫'一.inject(:+)',但是(或者'a.inject(&:+)',如果你真的願意傳遞一個proc的話)。 –

+0

@ ChrisJester-Young是的,加入答案。 – xdazz

相關問題