用一对二块参数调用`Hash #map`

apd*_*pdm 2 ruby arrays hash

entries哈希在哪里:

entries = { foo: 1, bar: 2 }
Run Code Online (Sandbox Code Playgroud)

这是我熟悉的语法:

entries.map { |key, val| "#{key} #{val}" }
#=> ["foo 1", "bar 2"]
Run Code Online (Sandbox Code Playgroud)

这是我在教程中遇到的语法:

entries.map { |key_val| "#{key_val.first} #{key_val.last}" }
#=> ["foo 1", "bar 2"]
Run Code Online (Sandbox Code Playgroud)

我是Ruby的新手,所以我很惊讶这两种语法都能正常工作.我的问题是:

  1. 这两者有什么区别吗?

  2. 为什么这样做 - 是因为哈希表对象以两种不同的方式实现Enumerable接口(提供map方法)?

Ser*_*sev 5

不,它与哈希和可枚举无关(好吧,差不多).这是我称之为"数组解构"的东西.Ruby有一种很好的方法可以将数组分开.假设你有这个双元素数组

ary = [1, 2]
Run Code Online (Sandbox Code Playgroud)

您可以通过单独访问它们来获取其元素

a = ary.first # or ary[0]
b = ary.last # or ary[-1]
Run Code Online (Sandbox Code Playgroud)

或者你可以通过直接将数组分配给变量来"解构"数组

a, b = ary
Run Code Online (Sandbox Code Playgroud)

a将是数组的第一个元素,b- 第二个(在这种特殊情况下也是最后一个).

您的示例中也会发生同样的事情 当在哈希上使用时,Enumerable each(即map调用的内容)产生两个元素的数组,一个键及其值.

现在,如果块只有一个参数,它就是那个数组.如果它有两个,你的阵列将被拆开.

是的,更喜欢第一种方法.更具可读性.