arrays - 使用一与两个 block 参数调用 `Hash#map`

标签 arrays ruby hash

其中 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 新手,所以我很惊讶这两种语法都能工作。我的问题是:

  1. 两者有什么区别吗?

  2. 为什么这样做 - 是因为哈希表对象以两种不同的方式实现 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/

相关文章:

Javascript,迭代两个对象数组并将一个项目从一个数组添加到另一个数组 "if it doesn' t 存在”

mysql - 在多列中搜索的最佳方式

c# - C#中的哈希密码?密码/PBKDF2

python - 创建数组的 RDD

jquery - 将ajax响应数组存储到变量中以供以后使用

c++ - 对数组进行排序并维护元素的旧索引

ruby-on-rails - 从 View 设置标题状态

ruby - 数字转换 - Fixnum/Bignum

ruby - pig 的拉丁文翻译

c# - 将哈希值转换为十六进制字符串