为什么这个ruby方法调用中的空间有意义?

时间:2015-04-27 15:28:14

标签: ruby

我正在Rails应用程序中编写jsonify视图。我有:

json.samba_secrets_present(not @idp_ad_info.samba_secrets.nil?)

这会产生语法错误:

app/views/idp_ad_infos/show.jsonify:7: syntax error, unexpected tIVAR, expecting '(' 

然而,

json.samba_secrets_present (not @idp_ad_info.samba_secrets.nil?)

工作正常。我原以为第一个是对samba_secrets_present对象Jsonify::Builder方法的方法调用,第一个参数为not idp_ad_info.samba_secrets.nil?。为什么空间很重要?

1 个答案:

答案 0 :(得分:5)

puts(not true)  #=> error
puts (not true) #=> false, CASE 2
puts(not(true)) #=> false

Ruby允许您省略用于调用方法的括号。通常,如果只有一个方法调用,则可以省略括号。但是,当方法调用位于另一个方法调用的参数位置时,您不能省略它(一般情况,请参见更新部分中的特殊情况),因为这会引入歧义。请考虑以下示例:

puts(not true, false)
puts(some_method arg1, arg2)

Ruby解析器无法确定false(或arg2)是内部方法的参数,还是外部puts,因此会针对这些情况引发错误。解析器没有运行时上下文来确定内部方法的优点,因此它不关心它是否是一元方法(如not)。

CASE 2为例,它被解释为:

puts( (not false))

你可以写:

puts (not false), true, (not true)

他们是puts的所有论据。

Some Ref: Positional Arguments

<强>更新 toro2k 评论说puts(system 'ls')有效。这是因为system接受了*args,它会抓住所有其他参数。对于外部方法,没有任何争论,绝对是:)。结果,在这种情况下没有歧义。

def a *args
  args
end
p(a 1, 2, 3, 4) #=> [1, 2, 3, 4]

但是,我投票使用必要的括号编写更清晰的代码,以使代码更具可读性。