gpt4 book ai didi

ruby - 为什么在此 ruby​​ 方法调用中空间很重要?

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:57 27 4
gpt4 key购买 nike

我正在 Rails 应用程序中编写一个 jsonify View 。我有:

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?)

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

最佳答案

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]

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

关于ruby - 为什么在此 ruby​​ 方法调用中空间很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29899867/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com