Vi esto en mis páginas GSP generadas. ¿Qué significa el ? significa?¿Qué significa el signo de interrogación en GSP/Grails?
<g:textField name="name" value="${phoneInstance?.name}" />
Vi esto en mis páginas GSP generadas. ¿Qué significa el ? significa?¿Qué significa el signo de interrogación en GSP/Grails?
<g:textField name="name" value="${phoneInstance?.name}" />
Es la "seguridad de navegación del operador", que es una característica maravillosa que evita de forma concisa excepciones de puntero nulo. Ver http://docs.groovy-lang.org/latest/html/documentation/index.html#_safe_navigation_operator
En este caso, si phoneInstance
es nulo, entonces no tratar de obtener la propiedad name
y causar una NPE - sólo se establece el valor de la etiqueta del campo en null.
El operador ?
permite valores nulos en Groovy (y por lo tanto, GSP). Por ejemplo, normalmente en gsp,
<g:field name="amount" value="${priceDetails.amount}" />
Si priceDetails
es nulo, esto va a lanzar una NullPointerException
.
Si utilizamos el operador ?
lugar ...
<g:field name="amount" value="${priceDetails?.amount}" />
ahora el valor de ${priceDetails?.amount}
es nula, en lugar de lanzar una excepción de puntero nulo.
Esta es una característica muy importante en Groovy. Si el objeto es nulo (es decir, "phoneInstance" es nulo), entonces proporciona un valor "nulo". Esta función se denomina "Operador de navegación segura". Simplemente cuando utilizamos esta función, no es necesario verificar el objeto ("phoneInstance") es nulo o no.
el operador de navegación segura (?.) Devuelve nulo si el objeto de la izquierda es nulo, de lo contrario, devuelve el valor del miembro derecho de ese objeto. por lo que se acaba de phoneInstance?.name
shorthandn para phoneInstance == null ? null : phoneInstance.name
por ejemplo:
a = x?.y
es sólo la abreviatura de:
a = (x == null ? null : x.y)
que es la abreviatura de:
if(x == null){
a = null
} else {
a = x.y
}
Gracias! Había estado buscando en Google por un tiempo, pero no encontré una respuesta. –
La url 404s ahora – juan
Para mayor frescura también puede agregar un valor predeterminado razonable con el operador de Elvis, por ejemplo: '$ {phoneInstance? .number?: '+ 44'}' Rock groovy con el rey bebé! – barrymac