Roo*_*nen 8 ruby syntax language-design safe-navigation-operator
Ruby 2.3.0引入了安全的导航语法,通过引入一个仅在前一个语句的值不为nil时调用该方法的新运算符,简化了链式方法调用的零处理.这是一个已经存在的功能,例如在C#,Groovy和Swift中.例如在Groovy中,语法是
foo?.bar
Run Code Online (Sandbox Code Playgroud)
这基本上意味着结果值是foo.bar的结果值,除非foo为null,在这种情况下返回值也为null,因此不会抛出异常.此外,C#(称为空条件运算符)和Swift(称为可选链接表达式)使用此表示法.
所以语法似乎在其他语言中非常标准.现在,为什么在Ruby中使用语法
foo&.bar
Run Code Online (Sandbox Code Playgroud)
代替?
Roo*_*nen 16
这个答案是基于对Ruby问题跟踪中的功能请求的讨论.根据Ruby的作者Yukihiro Matsumoto的说法,不可能?.在Ruby中引入运算符,因为它foo?是有效的方法名称,因此无法解析.操作员的第一个候选者是逆序.?.该语法已经实现(由Nobuyoshi Nakada 执行)但后来被丢弃,因为它被认为太接近其他语言引入的原始语法(如前所述,这是不可行的).Matsumoto 建议&.接受最终语法.
以下是Matsumoto给出的这种语法的理由
我想了一会儿,并考虑引入
&.代替.?,因为:
.?类似于?.Swift和其他语言,但无论如何都是不同的.- 由于
?Ruby中的方法名称的有效后缀,我们已经在程序中看到了很多问号.u&.profile提醒我们作为简短的形式u && u.profile.但是
&.应该保持行为,即它应该跳过nil但是要认识到false.
然后,此语法作为Ruby 2.3.0-preview1的一部分发布.