GSP / Grails中的问号是什么意思?

我在我生成的GSP页面中看到了这一点。 这是什么 意思?

<g:textField name="name" value="${phoneInstance?.name}" /> 

这是“安全的导航操作员”,这是一个简洁的避免空指针exception的Groovyfunction。 请参阅http://docs.groovy-lang.org/latest/html/documentation/index.html#_safe_navigation_operator

在这种情况下,如果phoneInstance为null,那么它不会尝试获取name属性并导致NPE – 它只是将field标记的值设置为null。

这个? 运算符允许Groovy(以及GSP)中的空值。 例如,通常在gsp中,

 <g:field name="amount" value="${priceDetails.amount}" /> 

如果priceDetails为null,则会抛出NullPointerException

如果我们使用? 而不是…

 <g:field name="amount" value="${priceDetails?.amount}" /> 

现在${priceDetails?.amount}的值是null,而不是抛出空指针exception。

这在Groovy中是非常重要的特性。 如果对象为空(即“phoneInstance”为空),则提供“null”值。 这个function被称为“安全导航操作员”。 简单地说,当我们使用这个function时,不需要检查对象(“phoneInstance”)是否为空。

如果左侧的对象为空,则安全导航运算符(?。)返回null,否则返回该对象的右侧成员的值。 所以phoneInstance?.name只是phoneInstance == null ? null : phoneInstance.name shorthandn phoneInstance == null ? null : phoneInstance.name phoneInstance == null ? null : phoneInstance.name

例如:

 a = x?.y 

只是简写:

 a = (x == null ? null : xy) 

这是简写​​为:

 if(x == null){ a = null } else { a = xy }