为什么括号会影响哈希值?

8
当我使用respond_with并传递一个字面哈希时,它会给我返回错误:
syntax error, unexpected tASSOC, expecting '}'
`respond_with {:status => "Not found"}`

然而,当我将文字哈希值用括号括起来时,就像这样:
respond_with({:status => "Not found"})

该函数运行得非常顺利。为什么括号会有所区别?难道哈希不是一个封闭的调用吗?


我不确定为什么。但是一个好的知识点是,如果你想在使用哈希作为参数时避免使用括号,你可以避免使用所有括号使其正常工作:respond_with :status => "Not found" - TimPetricola
@TimPetricola 哇,多个值也可以工作。谢谢!那么为什么在将其用作参数时可以避免使用大括号? - RileyE
请参考Holger的答案。 - TimPetricola
@TimPetricola 是的,我看到了。有时候 Ruby 让我有点害怕,它几乎太聪明了。这可能会引发 Android 革命的开始。 - RileyE
这就是为什么我们喜欢它的原因 :) - TimPetricola
那些不是方括号,而是圆括号。 - sawa
1个回答

12

当调用方法时,方法名后面的左花括号被解释为一个代码块的开始,而不是哈希表的开始。这个解释优先于哈希表的解释。一种规避此问题的方法是使用括号来强制将其解释为方法参数。例如,请注意以下两个方法调用的含义差异:

# interpreted as a block
[:a, :b, :c].each { |x| puts x }

# interpreted as a hash
{:a => :b}.merge({:c => :d}) 

另一种方法是仅删除花括号,因为您始终可以跳过方法的最后一个参数的括号。Ruby足够“聪明”,可以将看起来像关联列表的所有内容解释为单个哈希表。请查看以下示例:
def foo(a, b)
  puts a.inspect
  puts b.inspect
end

foo "hello", :this => "is", :a => "hash"
# prints this:
# "hello"
# {:this=>"is", :a=>"hash"}

Ruby确实有很多很酷的“假设”。你说的“最后”是什么意思?在它之前可以有参数,然后仍然可以使用没有括号的哈希吗? - RileyE
1
@RileyE respond_with 的第一个参数是你要返回的资源,它可以是任意数量的资源。 - Dave Newton
@DaveNewton 是的。你提供的文档非常有帮助。很抱歉在之前提问时没有理解清楚。 - RileyE
哇,你们太棒了。这比任何搜索引擎都更容易理解。非常感谢你们! - RileyE
@sawa,非常抱歉我的用词冒犯了您,然而,按照定义它们仍然都是括号。每种类型有很多称呼方式,没有固定的规则。但是,从现在开始,我会努力用更清晰的解释来区分不同类型的括号。 - RileyE
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接