【问题标题】:What is the purpose of question mark(?) after a variable in GroovyGroovy中的变量后问号(?)的目的是什么
【发布时间】:2014-08-02 21:29:42
【问题描述】:

我是 grails 的新手,我在许多示例中发现变量可能以问号 (?) 结尾 像这样

boolean equals(other) {
    if(other?.is(this))
    return true
}

上面的代码包含 If 条件在另一个以 ? 结尾所以我想知道那个表示的含义

【问题讨论】:

  • 在 Bonita Studio 的一些自动生成的 Groovy 脚本中出现了相同的运算符。

标签: groovy


【解决方案1】:

?. 是一个空安全运算符,用于避免意外的 NPE。

if ( a?.b ) { .. }

相同
if ( a != null && a.b ) { .. }

但在这种情况下,is() 已经是 null 安全的,所以你不需要它

other.is( this )

应该不错。

【讨论】:

  • 我不熟悉 Groovy,但是如果 other 为空,other.is 如何工作?
  • 好问题。 is 的实现在DefaultGroovyMethods 中,调用者和被调用者由该方法的参数表示,然后检查对象引用是否相等,因此对调用者没有任何操作。
  • NPE = NullPointerException
【解决方案2】:

?.Safe navigation operator 有一个微妙之处,@dmahapatro 的回答中没有提到。

我举个例子:

def T = [test: true]
def F = [test: false]
def N = null

assert T?.test == true
assert F?.test == false
assert N?.test == null // not false!

换句话说,a?.b 仅在测试布尔值时与a != null && a.b 相同。不同之处在于第一个可以评估为a.bnull,而第二个只能评估为a.bfalse。如果将表达式的值传递给另一个表达式,这很重要。

【讨论】:

猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2019-09-16
  • 2017-08-21
  • 2021-05-27
相关资源
最近更新 更多