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

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的结果值,除非foonull,在这种情况下返回值也为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的一部分发布.

  • Matz在RubyConf 2015主题演讲中还解释了这种选择运算符的理由。观看视频可能比引用的错误报告更容易理解。他指出“&。”被称为“孤独的运算符”(有些想像力,可以看出它看起来像一个孤独的人,坐在地板上,盯着他们前面的圆点)。请在15:00至17:40之间查看幻灯片78-87 [YouTube主题视频](https://www.youtube.com/watch?v=LE0g2TUsJ4U) (3认同)
  • 如果您希望您的答案不是无意义的复制粘贴,而是一个有用的资源,您不需要逐字引用讨论; 你应该至少纠正它中的语法错误(使用像[[]`这样的编辑标记),或者更好,用你自己的话来改写它.还不清楚什么是"跳过`nil`但是识别'false`"的意思.你能说清楚这意味着什么吗?没有它,你的问题和答案只是讨论的副本,我认为它没有任何价值. (2认同)