0

我正在尝试与Hash班级一起玩。这是我降低哈希键的方法:

myhash.map { |k, v| k.downcase, v }

但我得到:

SyntaxError: (irb):11: syntax error, unexpected '}', expecting '='

但是,如果我这样做:

myhash.map { |k, v| [k.downcase, v] }

它得到正确的小写,即使它在一个数组中。为什么它不让我做

myhash.map { |k, v| k.downcase, v }
4

4 回答 4

1

#map使用 Class'#each方法进行迭代,Hash产生两个值#each(每个位置的键和值)。然而,每个结果都必然是一个数组。幸运的是,有一种方法可以将数组转回哈希。

如果您希望能够将键小写,您可以使用 zipped-array-to-Hash 转换方法Hash[]

Hash[myhash.map { |k, v| [k.downcase, v] }]

这会给你你想要的答案。

于 2013-11-13T00:51:35.843 回答
1

map 想要对每一对进行操作并返回 1 个值。

当您使用 [] 时,它返回一个值 - 一个数组。当您使用 k.downcase 时, v 它可以执行 k.downcase 部分,但是它不知道是什么, v意思。当它应该是一件事时,试图得到两件事的结果是很困惑的。当它们在[](array) 括号内时,它们只是返回的一个数组的元素。`

于 2013-11-13T00:18:37.023 回答
0

块的返回值将是其中最后一个表达式的返回值。这意味着它必须是一个 Ruby 对象。k.downcase, v不是 Ruby 对象。无论特定方法的规范是什么,这在语法上都是错误的。

特别是,map方法在每次迭代中获取块的返回值,并将它们放入一个数组中。如果您想要一些保留键信息和哈希值的构造,至少,您必须返回一个包含键及其值信息的单个对象。包含它们的数组即[k.downcase, v]是一个合理的选择。

于 2013-11-13T03:54:10.630 回答
0

请阅读错误信息。你有一个SyntaxError. 您的代码甚至在语法上都无效。它甚至不会编译,更不用说运行了。downcase甚至没有进入图片。

foo, bar

Hash不是一个有效的 Ruby 表达式,这与or无关downcaseSyntaxError如果您尝试以下操作,您还将获得一个:

1, 1
于 2013-11-13T10:26:43.797 回答