为什么Ruby使用自己的语法作为安全导航操作符



Ruby 2.3.0引入了安全导航语法,该语法通过引入一个新的运算符来简化对链式方法调用的nil处理,该运算符仅在前一条语句的值不是nil时调用该方法。这是一个已经存在的特性,例如在C#、Groovy和Swift中。例如,在Groovy中,语法是

foo?.bar

这基本上意味着结果值是foo.bar的结果值,除非foonull,在这种情况下,返回值也是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的一部分发布。

最新更新