2014-04-16 10 views
7

Di seguito è riportato il blocco di codice, che sto utilizzando.Confusione nell'accesso dinamico variabile in ColdFusion

<cfset variables.test1 = 'interface.temp1'> 
<cfset variables.test2 = 'interface.temp2'> 
<cfset variables.test3 = 'variables.' & variables.test2> 
<cfset variables["#variables.test1#"] = 23> 
<cfset "#variables.test3#" = 50> 

<cfdump var="#variables#"> 
<cfdump var="#variables['interface.temp1']#"> 

L'immagine allegata descrive l'uscita, sto ottenendo. Il primo cfdump visualizza il valore "interface.temp1" come "non definito" e nel secondo cfdump visualizza il valore come "23". Se guardi anche al primo cfdump, sta visualizzando tutte le variabili nello scope VARIABLES ma non c'è alcuna variabile con il valore "23", quindi nel secondo cfdump da dove ottiene il valore come "23"?

Please help me per sapere la causa dietro questo.

+1

L'output che hai postato sopra non è l'output che ottengo quando eseguo quel codice su CF9. Funziona tutto come previsto per me (provalo su cflive.net) –

+0

Quale versione di CF stai usando? –

+0

@ Michael Giovanni Pumo, sto usando CF9 –

risposta

2

ho incrinato. Lo scrivo completamente sul mio blog: "Odd behaviour with struct keys with dots in their names".

In pratica una volta che hai un substruct chiamato interface, che è - come ha detto @Leigh - creato da questo:

<cfset "#variables.test3#" = 50> 

Poi ColdFusion (e, FWIW, Railo), si confondono quando si cerca di risolvere i tasti struct con prefisso interface.: vede quei riferimenti come riferimenti alle chiavi all'interno della sottostruttura interface, anziché semplicemente i nomi dei tasti.

Se non si dispone di quella riga di codice sopra, CF è in grado di vedere il valore del nome con chiave punteggiata.

+0

Ah, hai ragione. Questo è interessante. Io di solito uso la notazione di matrice ogni volta che i nomi di variabili virano dalla retta e stretta (alfa/numerico/trattino basso), quindi non mi sono imbattuto in quello. Onestamente, non sono sicuro che l'espressione 'st.prefix.key2' * dovrebbe * funzionare. Consentendo che la sintassi introduca l'ambiguità, perché sarebbe quasi impossibile distinguere tra una semplice chiave chiamata 'prefix.key2' e una struttura chiamata' prefix', contenente 'key2'. cioè 'st ['prefix.key2'] e st = {prefix = {key2 =" aaa "}}' – Leigh