我在查看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
之后的冒号。我不确定为什么会在那里期待}
,为什么使用括号会改变它。
答案 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'
消除歧义消除歧义。