2011-07-20 59 views
1

当的()需要在红宝石的方法调用在帮助我有代码:/导轨

signed_in? ? link_to("Sign out", signout_path, :method => :delete) : link_to("Sign in", signin_path) 

但是同样的事情可以这样写:

if(signed_in?) 
    link_to 'Sign Out', signout_path, :method => :delete 
else 
    link_to 'Sign In', signin_path 
end 

在第二种情况下,方法调用的参数不是必需的,在第一种情况下是这样。这是为什么?

+0

因为在第一种情况下,它们的语法是不明确的。三元运算符是这样的:条件? if_true:if_false。如果你没有括号,那就好像你试图在真实部分有多个陈述一样。 –

回答

3

当函数调用没有歧义时,不需要parens。例如:

foo 1, 2 resolves to foo(1,2) 

和类似foo 1, bar 2 would be foo(1,bar(2)),但对于foo 1, bar 2, 3,可以去到任何foo(1,bar(2,3))foo(1,bar(2),3)

所以在最后一个例子,你需要在括号把自己告诉红宝石你实际上希望它做到。

另外,如果你想调用的方法的返回值的方法,你需要括号太 即foo(1,2).bar

-1

我认为它只是编写代码的风格..

我喜欢选项1,因为它只使用1行..

+1

它不是一种风格。一个产生错误,另一个不产生错误。 – Will