在这种情况下,为什么在这种情况下不能使用密钥?

时间:2013-11-13 00:14:14

标签: ruby hash

我正在尝试使用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 个答案:

答案 0 :(得分:1)

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

使用[]时,它返回一个值 - 一个数组。当你使用k.downcase时,v它可以执行k.downcase部分,但是它不知道, v的含义。当它应该是一个时,它试图得到两个结果的结果很困惑。当它们位于[](数组)括号内时,它们只是返回的一个数组的元素。 `

答案 1 :(得分:1)

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

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

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

这会给你你想要的答案。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

foo, bar

不是有效的Ruby表达式,这与Hashdowncase无关。如果您尝试以下内容,您还将获得SyntaxError

1, 1