Ruby 用大括号声明散列是否需要赋值?

Ruby 用大括号声明散列是否需要赋值?,ruby,hash,variable-declaration,Ruby,Hash,Variable Declaration,我想我可以使用{}或hash[]来声明一个hash,但是大括号似乎不起作用,除非我将它赋给一个变量,见下文。我猜irb会对它是散列还是块感到困惑。这是正确的,还是我用大括号错误地声明了哈希 >> puts h = { :a=>1, :b=>2 } {:a=>1, :b=>2} >> puts { :a=>1, :b=>2 } SyntaxError: (irb):58: syntax error, unexpected =>,

我想我可以使用{}或hash[]来声明一个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}
>>

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

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

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

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

您的put{…}看起来像是在传递一块代码。由于puts是一种可以接受参数和/或块的方法,因此需要指定花括号内的内容是参数而不是块。尝试:

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

您的put{…}看起来像是在传递一块代码。由于puts是一种可以接受参数和/或块的方法,因此需要指定花括号内的内容是参数而不是块。尝试:

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

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

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}

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

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}

Ruby 1.9风格的散列(如:1)可能需要一些时间才能习惯,但它们实际上非常方便。它还使东西与其他语言(如Objective-C和JavaScript)更加一致。@tadman:只是如果您使用MongoDB,并且不得不说:$inc=>,'some.path'=>,它们就没那么有用了。。。一直都是这样。或者如果像a::b这样的东西让你的眼睛流血。离开我的草坪,等等:@muistooshort当然,你有一些奇怪的东西,比如a::b?:如果不小心的话,c::d,但是新语法并非不可能适应。另外,你可以混合搭配:a::b,'$c'=>:d。回答得好。有人知道为什么决定对不带块的put等方法使用括号吗?@CarySwoveland因为lexer/解析器不知道该方法是否带块,更不用说Ruby允许您动态地重新定义方法了。见鬼,你甚至可以将一个块传递给一个从不使用它的方法。我认为保持事情的一致性也很好,不引入更多的特殊情况。Ruby只是要求您在可能出现歧义的地方保持冗长。Ruby 1.9风格的散列(如:1)可能需要一些时间才能习惯,但它们实际上非常方便。它还使东西与其他语言(如Objective-C和JavaScript)更加一致。@tadman:只是如果您使用MongoDB,并且不得不说:$inc=>,'some.path'=>,它们就没那么有用了。。。一直都是这样。或者如果像a::b这样的东西让你的眼睛流血。离开我的草坪,等等:@muistooshort当然,你有一些奇怪的东西,比如a::b?:如果不小心的话,c::d,但是新语法并非不可能适应。另外,你可以混合搭配:a::b,'$c'=>:d。回答得好。有人知道为什么决定对不带块的put等方法使用括号吗?@CarySwoveland因为lexer/解析器不知道该方法是否带块,更不用说Ruby允许您动态地重新定义方法了。见鬼,你甚至可以将一个块传递给一个从不使用它的方法。我认为保持事情的一致性也很好,不引入更多的特殊情况。Ruby只是要求您在可能出现歧义的地方保持冗长。请提供一个带块的PUT示例。请提供一个带块的PUT示例。