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。我不确定为什么会在}那里期待,以及为什么使用括号会改变这一点。

4

2 回答 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' })

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

于 2015-11-09T05:07:39.213 回答
4

花括号在 Ruby 中具有双重作用。它们可以定界散列,但也可以定界块。在这种情况下,我相信您的第二个示例被解析为:

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

因此action: 'atom',作为独立表达式无效的 your 将被解析。

括号用于消除{...}作为散列的歧义。

于 2015-11-09T05:06:45.733 回答