苦苦挣扎着理解这段代码

时间:2012-05-14 18:40:17

标签: ruby

我正在关注rubymonk.com上的互动教程,刚刚开始使用lambda,我觉得我掌握的相当不错,但是我对这段代码有点遗失:

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])部分只是拉动了通过块传递的每个数组的索引位置中的数据。对这里发生的事情有一个明确的解释将非常感激,我觉得我几乎就在那里。谢谢。

2 个答案:

答案 0 :(得分:2)

  

在第3行的第一个[和第5行的]之间输入的名称是保存在数组还是哈希?

名称字符串保存在数组中,所有这些都包含在另一个“主”数组中。在循环遍历“master”数组时,其元素(即["Christopher", "Alexander"]等)将被传递到each调用之后的块。


fn.call(pair[0], pair[1])中,传递给函数的lambda使用两个参数调用:each迭代提供的名字和姓氏。假设这个lambda返回一些值。在这种情况下,lambda返回一个连接的字符串,因此表达式的部分计算结果如下:

result << "Christopher Alexander"

从这里开始,<<重载运算符表示应该将右操作数推送到左操作数(数组)。

答案 1 :(得分:1)

  

在第3行的第一个[和第5行]之间输入的名称是保存在数组还是哈希?

它是一个数组数组,即数组的每个元素是另一个包含两个字符串的数组。所以

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

lambda是一个接受两个参数并将它们格式化为字符串的方法。

  

当调用`.each do | pair |时我们正在迭代哈希中的每个数组,这是正确的吗?

正如我所解释的,这里没有哈希。它只是迭代数组,每个元素本身就是一个包含两个元素(名字和姓氏)的数组。 result填充了lambda方法的返回值。