【问题标题】:Why do parentheses affect hashes?为什么括号会影响哈希?
【发布时间】:2013-03-06 14:35:09
【问题描述】:

当我使用 respond_with 并传递文字哈希时,它给了我错误:

syntax error, unexpected tASSOC, expecting '}'
`respond_with {:status => "Not found"}`

但是,当我将文字哈希括在括号中时:

respond_with({:status => "Not found"})

函数运行顺利。为什么括号有区别?哈希不是封闭调用吗?

【问题讨论】:

  • 我不知道为什么。但是如果你想在使用散列作为参数时避免使用括号,你可以避免所有这些以使其工作:respond_with :status => "Not found"
  • @TimPetricola 哇哦。这也适用于多个值。谢谢!现在为什么在使用它作为参数时可以避免使用大括号?
  • 查看 Holger 的回答。
  • @TimPetricola 是的。我看到了。 Ruby 有时让我有点害怕。它几乎太聪明了。它可能会引发安卓革命。
  • 这就是我们喜欢它的原因:)

标签: ruby hash syntax


【解决方案1】:

当调用一个方法时,方法名后面的左大括号被解释为一个块的开始。这优先于作为哈希的解释。规避该问题的一种方法是使用括号将解释强制为方法参数。例如,请注意这两个方法调用的含义不同:

# 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 respond_with 的第一个参数是您要返回的资源,它是任意数量的资源。
  • @DaveNewton 是的。您引用的文档很有帮助。很抱歉当我问的时候没有理解他们。
  • 哇。你们真是太棒了。这比任何谷歌搜索都更有意义。非常感谢!
  • @RileyE respond_with docs 详细说明了方法的参数。第一个参数是任意数量的资源。
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 2015-06-30
相关资源
最近更新 更多