我正在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?
。为什么空间很重要?
答案 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]
但是,我投票使用必要的括号编写更清晰的代码,以使代码更具可读性。