0

我正在关注 ruby​​monk.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 时做 |pair| 我们正在遍历哈希中的每个数组,这是正确的吗?在第 6 行的下一段代码中:

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

我相信我们正在将每个数组元素推入结果数组,尽管我不确定这段代码是如何工作的,尤其是fn.call部分,因为我相信这(pair[0], pair[1])部分只是将数据拉到通过块的每个数组的索引位置。对这里发生的事情的清晰解释将不胜感激,我觉得我几乎就在那里。谢谢。

4

2 回答 2

2

在第 3 行的第一[行和第 5行之间输入的名称是]保存在数组还是散列中?

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


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

result << "Christopher Alexander"

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

于 2012-05-14T18:48:05.473 回答
1

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

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

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

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

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

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

于 2012-05-14T18:47:48.423 回答