我正在尝试使用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 }
答案 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表达式,这与Hash
或downcase
无关。如果您尝试以下内容,您还将获得SyntaxError
:
1, 1