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

时间:2015-11-16 12:19:29

标签: ruby syntax language-design safe-navigation-operator

Ruby 2.3.0引入了安全导航语法,通过引入一个只调用该方法的新运算符,如果前一个语句的值不是 nil <,则可以简化链式方法调用的零处理/ em>的。这是一个已经存在的功能,例如在C#,Groovy和Swift中。例如in Groovy,语法为

foo?.bar

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

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

foo&.bar

代替?

1 个答案:

答案 0 :(得分:13)

此答案基于Ruby问题跟踪中的the discussion of the feature request。根据{{​​3}},在Ruby中引入运算符?.是不可能的,因为foo?是有效的方法名称,因此无法对其进行解析。运算符的第一个候选者是反向序列.?。该语法是Ruby's author Yukihiro Matsumoto(Nobuyoshi Nakada),但后来被丢弃,因为它被认为太接近其他语言引入的原始语法(如前所述,这是不可行的)。最终语法&.被Matsumoto接受为already implemented

这里是Matsumoto给出的这种语法的理由

  

我想了一会儿,并考虑引入&.代替.?,因为:

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

但应保留&.的行为,即应跳过nil,但要识别false

此语法随后作为suggested的一部分发布。