为什么在Ruby中有时需要使用括号?

3

最近我在查看Rails文档中的一些Ruby代码时,发现了一个奇怪的问题。

Ruby可以像这些例子一样传递参数:

redirect_to post_url(@post), alert: "Watch it, mister!"
redirect_to({ action: 'atom' }, alert: "Something serious happened")

但是第二种情况对我来说看起来很奇怪。似乎你应该可以这样传递它:

redirect_to { action: 'atom' }, alert: "Something serious happened"

无论是否使用括号,意思都是相同的。但是你得到的是:
syntax error, unexpected ':', expecting '}'

提到action后面的冒号。我不确定为什么它会期望在那里有},以及为什么使用括号会改变这一点。

2个回答

6

因为{ ... }有两个含义:哈希字面量和块。

考虑以下代码:

%w(foo bar baz).select { |x| x[0] == "b" }
# => ["bar", "baz"]

在这里,{ ... } 是一个代码块。

现在想象一下,您正在调用当前对象的方法,因此不需要显示指定接收者:

select { |x| x[0]] == "b" }

现在想象一下,您不关心参数:
select { true }

这里,{ true } 仍然是一个块,而不是哈希表。因此,在您的函数调用中也是如此:
redirect_to { action: 'atom' }

(大致)相当于

redirect_to do
  action: 'atom'
end

而且它是无意义的。然而,

redirect_to({ action: atom' })

该函数有一个参数列表,由哈希表组成。


4

花括号在Ruby中有双重用途。它们可以限定哈希,也可以限定块。在这种情况下,我认为您的第二个示例被解析为:

redirect_to do
  action: 'atom' 
end, alert: "Something serious happened"

因此,您的action: 'atom'不作为独立表达式有效,将被解析为这样。括号用于将{...}看作哈希以消除歧义。

嘿,为什么要踩我?这个答案是正确的。 - acobster

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