Ruby 2.3.0引入了安全导航语法,通过引入一个只调用该方法的新运算符,如果前一个语句的值不是 nil <,则可以简化链式方法调用的零处理/ em>的。这是一个已经存在的功能,例如在C#,Groovy和Swift中。例如in Groovy,语法为
foo?.bar
这基本上意味着结果值是 foo.bar 的结果值,除非 foo null ,在这种情况下返回值也是 null 因此不会抛出任何异常。此外,C#(称为空条件运算符)和Swift(称为可选链接表达式)使用此表示法。
因此语法似乎在其他语言中非常标准。现在,为什么在Ruby中语法是
foo&.bar
代替?
答案 0 :(得分:13)
此答案基于Ruby问题跟踪中的the discussion of the feature request。根据{{3}},在Ruby中引入运算符?.
是不可能的,因为foo?
是有效的方法名称,因此无法对其进行解析。运算符的第一个候选者是反向序列.?
。该语法是Ruby's author Yukihiro Matsumoto(Nobuyoshi Nakada),但后来被丢弃,因为它被认为太接近其他语言引入的原始语法(如前所述,这是不可行的)。最终语法&.
被Matsumoto接受为already implemented。
这里是Matsumoto给出的这种语法的理由
我想了一会儿,并考虑引入
&.
代替.?
,因为:
.?
与Swift和其他语言中的?.
类似,但无论如何都不同。- 由于
?
是Ruby中方法名称的有效后缀,我们已经在程序中看到了很多问号。u&.profile
提醒我们u && u.profile
的简短形式。但应保留
&.
的行为,即应跳过nil
,但要识别false
。
此语法随后作为suggested的一部分发布。