2012-05-14 59 views
0

我下面的互動式教學rubymonk.com和剛開始與拉姆達的,我覺得我把握得相當好,但我有點與此代碼丟失:努力理解這些代碼

1 def with_names(fn) 
2 result = [] 
3 [ ["Christopher", "Alexander"], 
4  ["John", "McCarthy"], 
5  ["Joshua", "Norton"] ].each do |pair| 
6  result << fn.call(pair[0], pair[1]) 
7 end 
8 result 
9 end 
10 l = lambda { |first_name, last_name| "#{first_name} #{last_name}" } 
11 with_names(l) 

是名稱之間輸入線3的第一[和線5的]在陣列或哈希舉行?我的理解是它們是數組的散列,並且在調用`.each do | pair |時我們正在迭代散列中的每個數組,這是正確的嗎?在第6行的下一段代碼:

result << fn.call(pair[0], pair[1]) 

我相信,我們正在推動每個數組元素到結果數組,雖然我不知道這個代碼是如何工作的尤其是fn.call一部分,我相信(pair[0], pair[1])部分被簡單地在穿過塊傳遞的每個陣列的索引位置拉數據。對這裏發生的事情的清楚解釋將非常感謝,我覺得我幾乎在那裏。謝謝。

+1

在一本書中看到這個代碼是令人驚訝的,恕我直言,它是一個單式的Ruby。據我所知,使用一個奇怪的λ,而不是後來以示區別塊,但'each'應該是一個'map'和'pair'應在塊參數進行解壓縮。 – tokland

回答

2

之間是進入名線3的第一[和5號線的]在數組或哈希舉行?

名稱字符串保存在數組中,所有這些都包含在另一個「主」數組中。通過「主」陣列循環,它的元素(即,["Christopher", "Alexander"]等)將被傳遞到塊接續在each呼叫。


fn.call(pair[0], pair[1]),傳遞給函數的拉姆達被調用兩個參數:由each迭代所提供的名字和姓氏。這個lambda假定返回一些值。在這種情況下,拉姆達返回一個串聯的字符串,所以表達式部分的計算結果爲是這樣的:

result << "Christopher Alexander" 

從這裏,<<重載操作者指示右操作數應該推到左操作數(陣列)。

+0

謝謝我認爲主要的問題是,我得到由.CALL和散列/陣列的問題混爲一談,感謝其分解 – Tom

1

名稱是在數組中保存的第3行[行5]之間輸入的嗎?

它是一個數組的數組,即數組的每個元素是另一個包含兩個字符串的數組。所以

result.first 
=> ["Christopher", "Alexander"] 

拉姆達是需要兩個參數並將它們格式化爲一個字符串的方法。對|

時調用`。每次做

|我們正在迭代散列中的每個數組,這是正確的嗎?

正如我所解釋的,這裏沒有哈希值。它只是迭代數組,每個元素本身就是一個包含兩個元素(名字和姓氏)的數組。 result填充有拉姆達方法的返回值(S)。