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

时间:2015-11-09 04:57:45

标签: ruby-on-rails ruby syntax syntax-error ruby-2.2

我在查看Rails docs的一些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 个答案:

答案 0 :(得分:6)

因为{ ... }有两个含义:hash literal和block。

考虑一下:

%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' })

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

答案 1 :(得分:4)

Curly braces在Ruby中具有双重功能。它们可以分隔哈希值,但它们也可以分隔块。在这种情况下,我相信你的第二个例子被解析为:

$("div:contains('Send')").last().click(function(event){
    try{
        console.log("preventing default");
        event.preventDefault();
    }catch(error){
        console.log(error);
    }
    try{
        console.log("stopping propogation");
        event.stopPropagation();
    }catch(error){
        console.log(error);
    }
    alert("Hello");
});

因此,作为独立表达式无效的redirect_to do action: 'atom' end, alert: "Something serious happened" 将被解析为。

括号用于将action: 'atom'消除歧义消除歧义。