在Ruby上声明Hash时出现错误

时间:2019-11-30 04:56:20

标签: ruby hash

我目前正在学习Ruby,在本教程中,声明哈希的方法如下:

states {
  "Pennsylvania" => "PA",
  "Quebec" => "MTL"
}

puts states["Pennsylvania"]

错误消息告诉我:

[Running] ruby "c:\Users\ilyes\OneDrive\Bureau\Concordia\2nd Year\Fall 2019\COMP 348\RubyPrograms\practice.rb"
c:/Users/ilyes/OneDrive/Bureau/Concordia/2nd Year/Fall 2019/COMP 348/RubyPrograms/practice.rb:2: syntax error, unexpected =>, expecting '}'
  :Pennsylvania => "PA",
                ^~
c:/Users/ilyes/OneDrive/Bureau/Concordia/2nd Year/Fall 2019/COMP 348/RubyPrograms/practice.rb:2: syntax error, unexpected ',', expecting end-of-input
  :Pennsylvania => "PA",
                       ^

[Done] exited with code=1 in 0.171 seconds

我不明白为什么,因为我一直遵循他的确切说法 我目前正在使用VSC,因为原子根本无法工作。

1 个答案:

答案 0 :(得分:1)

当传递Hash文字作为不使用括号发送消息的唯一参数时,块和Hash文字之间存在歧义。

即当您编写类似

的内容时
foo {
  # something
}

这可能意味着您正在发送消息foo并传递一个块,或传递一个Hash。 Ruby将其解释为传递一个块,因此Ruby希望# something表达式或表达式序列。

为了让Ruby清楚地知道您要传递Hash,应使用括号使大括号位于参数列表内:

states({
  "Pennsylvania" => "PA",
  "Quebec" => "MTL"
})

puts states["Pennsylvania"]
# PA

当然,这里假设states的定义合适,如下所示:

states_cache = {}
define_method(:states) do |states = (states_not_passed = true; nil)|
  return states_cache.dup if states_not_passed
  states_cache = states_cache.merge(states).freeze
end