Ruby 2.3.0引入了安全导航语法,该语法通过引入一个新的运算符来简化对链式方法调用的nil处理,该运算符仅在前一条语句的值不是nil时调用该方法。这是一个已经存在的特性,例如在C#、Groovy和Swift中。例如,在Groovy中,语法是
foo?.bar
这基本上意味着结果值是foo.bar的结果值,除非foo是null,在这种情况下,返回值也是null并且因此不会抛出异常。C#(称为null条件运算符)和Swift(称为可选链接表达式。
因此,在其他语言中,语法似乎是相当标准的。现在,为什么Ruby中的语法是
foo&.bar
相反?
这个答案基于Ruby问题跟踪中对特性请求的讨论。根据Ruby的作者Yukihiro Matsumoto的说法,不可能在Ruby中引入运算符?.
,因为foo?
是有效的方法名,因此无法解析。第一个候选算子是反序.?
。该语法已经实现(由Nobuyoshi Nakada),但后来被丢弃,因为它被认为与其他语言引入的原始语法过于接近(如前所述,这是不可行的)。最后的语法&.
被Matsumoto所接受。
以下是Matsumoto 给出的这种语法的理由
我想了一会儿,并考虑引入
&.
而不是.?
,因为:
.?
在Swift和其他语言中与?.
相似,但无论如何都不同- 由于
?
是Ruby中方法名称的有效后缀,我们在程序中已经看到了很多问号- CCD_ 10作为CCD_
但是
&.
的行为应该保持,即它应该跳过nil
而识别false
。
该语法随后作为Ruby 2.3.0-preview1的一部分发布。