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