17

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

foo?.bar

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

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

foo&.bar

反而?

4

1 回答 1

27

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

这是松本给出的这种语法的理由

我考虑了一会儿,并考虑引入&.而不是.?,因为:

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

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

该语法随后作为Ruby 2.3.0-preview1的一部分发布。

于 2015-11-16T12:19:28.613 回答