2012-05-14 26 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)。