声明大括号的散列需要赋值吗?

时间:2014-10-23 16:06:52

标签: ruby hash variable-declaration

我以为我可以使用{}或Hash []来声明哈希,但是花括号似乎不起作用,除非我将它分配给变量(见下文)。我猜irb对于它是哈希还是块都感到困惑。这是正确的,还是我用花括号错误地声明哈希?

>> puts h = { :a=>1, :b=>2 }
{:a=>1, :b=>2}

>> puts { :a=>1, :b=>2 }
SyntaxError: (irb):58: syntax error, unexpected =>, expecting '}'
puts { :a=>1, :b=>2 }
           ^
        from /usr/bin/irb:12:in `<main>'

>> puts Hash[ :a=>1, :b=>2 ]
{:a=>1, :b=>2}
>>

3 个答案:

答案 0 :(得分:6)

您可以通过添加括号来解决此问题:

puts({ :a => 1, :b => 2 })
# {:a=>1, :b=>2}

如果省略括号,Ruby会将花括号解释为块:

puts { :a => 1, :b => 2 }
# SyntaxError: unexpected ':', expecting '}'

# semantically the same as

puts do
  :a => 1, :b => 2
end
# SyntaxError: unexpected =>, expecting keyword_end

但是你也可以省略两个括号,Ruby会将它视为哈希:

puts :a => 1, :b => 2
# {:a=>1, :b=>2}

# same as

puts(:a => 1, :b => 2)
# {:a=>1, :b=>2}

# same as

puts({:a => 1, :b => 2})
# {:a=>1, :b=>2}

你甚至可以使用符号键的短符号; - )

puts a: 1, b: 2
# {:a=>1, :b=>2}

答案 1 :(得分:2)

它只需要明确的语法,例如,

irb> puts({ :a => 1, :b => 2 })
{:a=>1, :b=>2}

答案 2 :(得分:1)

你的puts {...}看起来像ruby,好像你传递了一段代码。由于puts是一个可以接受参数和/或块的方法,因此需要指定大括号内的东西是一个参数而不是一个块。尝试:

puts( { a: 1, b: 2 })