加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:18:04 所属栏目:百科 来源:网络整理
导读:我正在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_pres
我正在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?)

工作良好.我原以为第一个是对Jsonify :: Builder对象的samba_secrets_present方法的方法调用,第一个参数不是idp_ad_info.samba_secrets.nil?.为什么空间有意义?

解决方法

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)是内部方法的参数还是外部put,因此它会针对这些情况引发错误.解析器没有运行时上下文来确定内部方法的arity,因此它不关心它是否是一元方法(如不是).

以案例2为例,其解释为:

puts( (not false))

你可以写:

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

他们都是看跌期权的论据.

Some Ref: Positional Arguments

更新:
toro2k评论说put(系统’ls’)有效.这是因为系统接受* args,它将获取所有其余参数.外部方法不会有任何参数,绝对:).结果,在这种情况下没有歧义.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读