其中 entries
是哈希:
entries = { foo: 1, bar: 2 }
这是我熟悉的语法:
entries.map { |key, val| "#{key} #{val}" }
#=> ["foo 1", "bar 2"]
这是我在教程中遇到的语法:
entries.map { |key_val| "#{key_val.first} #{key_val.last}" }
#=> ["foo 1", "bar 2"]
我是 Ruby 新手,所以我很惊讶这两种语法都能工作。我的问题是:
两者有什么区别吗?
为什么这样做 - 是因为哈希表对象以两种不同的方式实现
Enumerable
接口(interface)(提供map
方法)吗?
最佳答案
不,它与哈希和可枚举无关(好吧,几乎)。我称之为“数组解构”。 Ruby 有一种很好的方法来分解数组。假设你有这个二元素数组
ary = [1, 2]
您可以通过单独访问它们来获取其元素
a = ary.first # or ary[0]
b = ary.last # or ary[-1]
或者您可以通过将数组直接分配给变量来“解构”数组
a, b = ary
a
将是数组的第一个元素,b
- 第二个元素(在本例中也是最后一个元素)。
同样的事情发生在你的例子中。 Enumerable 的 each
(即 map
所调用的)在哈希上使用时,会生成包含两个元素(一个键及其值)的数组。
现在,如果 block 只有一个参数,那么它将是该数组。如果有两个,您的阵列将为您拆开。
是的,更喜欢第一种方法。更具可读性。
关于arrays - 使用一与两个 block 参数调用 `Hash#map`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37915516/