为什么Ruby使用自己的语法来安全导航操作符?
Ruby 2.3.0引入了安全的导航语法 ,通过引入一个仅在前一个语句的值不为nil时调用该方法的新运算符,简化了对链式方法调用的零处理。 这是一个已经存在的function,例如在C#,Groovy和Swift中。 例如在Groovy中 ,语法是
foo?.bar
这基本上意味着结果值是foo.bar的结果值,除非foo为null ,在这种情况下返回值也为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的一部分发布。