在Ruby上声明Hash时出现错误[关闭]

问题描述 投票:-2回答:1

我目前正在学习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,因为原子根本不起作用。

ruby hash
1个回答
1
投票

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

即当你写像

foo {
  # something
}

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

为了让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
© www.soinside.com 2019 - 2024. All rights reserved.