2013-09-24 13 views
12

Recentemente ho letto del comportamento di GStringImpl s rispetto a String s quando utilizzato nelle raccolte in Groovy.Groovy GStringImpl e comportamento stringa

Capisco che il motivo per cui questo è falsa ...

"${'test'}".equals("test") == false

è dovuta alla necessità di simmetria del contratto .equals(), però mi chiedevo se ci fosse un motivo il GStringImpl non poteva essere valutato immediatamente a String. Così, quando faccio qualcosa di simile ...

"${'someString'}"

non ottengo un GStringImpl, ottengo solo una pianura Java String posteriore, che posso usare subito come chiave in una mappa, ad esempio .

So che ci sono alcune soluzioni, come

String s = "${'someString'}"

però cose come questa è un po 'scomodo, e il disguido tra i GStringImpl e String sembra essere un grande 'Gotcha' per Newbees Groovy.

risposta

15

GStrings non vengono valutati immediatamente in String a causa di alcuni motivi, principalmente relativi alla valutazione lazy (che è abbastanza buona per la registrazione) e ai modelli. In Strings and GString è possibile trovare una buona spiegazione:

GString può comportare valutazione pigra quindi non è fino a quando il toString() viene richiamato il metodo che il GString viene valutata. Questa valutazione lenta è utile per cose come la registrazione in quanto consente il calcolo della stringa , le chiamate a toString() sui valori e la concatenazione delle stringhe diverse da eseguire pigramente se non del tutto.

GString è molto utile quando non si desidera utilizzare un motore di template, o quando si desidera veramente una valutazione lenta completa di GStrings. Quando alcune variabili incorporate in un GString, il toString() viene chiamato su quella variabile per ottenere una rappresentazione di stringa ed è inserito nella stringa finale .

Pertanto:

GString e String sono due classi distinte, e quindi all'impiego di GString oggetti come chiavi per oggetti sulla mappa o confronti che coinvolgono Gstring oggetti, può produrre risultati inattesi quando combinato con stringa oggetti dal momento che un GString e una stringa non avranno lo stesso hashCode né saranno uguali. Non esiste una coercizione automatica tra i due tipi di per confronti o chiavi di mappa, quindi a volte è necessario per invocare esplicitamente toString() su oggetti GString.

La conversione imprevista in stringa può causare problemi quando il codice è in attesa di un GString, come per i metodi nelle classi groovy.sql.

+0

Abbastanza corretto. Grazie per la spiegazione. – rcgeorge23

+0

Possiamo estendere dinamicamente la classe GStringImpl per chiamare automaticamente .toString() sulla costruzione? –

Problemi correlati