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

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

foo?.bar 

这基本上意味着结果值是foo.bar的结果值,除非foonull ,在这种情况下返回值也为null ,因此不会抛出exception。 此外, C# (称为空条件运算符 )和Swift (称为可选链接表达式 )使用此表示法。

所以语法似乎在其他语言中非常标准。 现在,为什么在Ruby中语法是

 foo&.bar 

代替?

这个答案是基于对Ruby问题跟踪中的function请求的讨论 。 根据Ruby的作者Yukihiro Matsumoto所说,不可能引入运营商?. 在Ruby中因为foo? 是有效的方法名称,因此无法解析。 操作员的第一个候选者是逆序.? 。 该语法已经实现 (由Nobuyoshi Nakada 执行 )但后来被丢弃,因为它被认为太接近其他语言引入的原始语法(如前所述,这是不可行的)。 最后的语法&. 被松本建议接受。

以下是Matsumoto给出的这种语法的理由

我想了一会儿,想着介绍&. 而不是.? ,因为:

  • .? 类似于?. 在Swift和其他语言中,但无论如何都是不同的。
  • 既然? 是Ruby中方法名称的有效后缀,我们已经在程序中看到了很多问号。
  • u&.profile提醒我们u && u.profile简短forms。

&.行为&. 应该保留,即它应该跳过nil但承认false

然后,此语法作为Ruby 2.3.0-preview1的一部分发布。