Domanda

Questo è stato uno dei maggiori ostacoli nell'insegnamento nuove persone ColdFusion.

Quando usare # è ambigua nella migliore delle ipotesi. Dal momento che il loro utilizzo spesso non creare un problema sembra che la maggior parte delle persone gravitano a usare troppo.

Quindi, quali sono le regole di base?

È stato utile?

Soluzione

Credo che possa essere più facile dire Dove non utilizzare #. L'unico posto è nelle dichiarazioni cfif, e CFSET dichiarazioni in cui non si utilizza una variabile per costruire una stringa tra virgolette. Lei avrebbe bisogno di utilizzare il segno # in quasi tutti gli altri casi.

Esempio di cui non si ha intenzione di usarlo:

<cfset value1 = 5>
<cfset value2 = value1/>

<cfif value1 EQ value2>
    Yay!!!
</cfif>

<cfset value2 = "Four plus one is " & value1/>

Gli esempi di dove si desidera utilizzare #:

in a cfset where the variable is surrounded by quotes
<cfset value1 = 5>
<cfset value2 = "Four plus one is #value1#"/>

the bodies of cfoutput, cfmail, and cffunction (output="yes") tags
<cfoutput>#value2#</cfoutput>
<cfmail to="e@example.com" from="e@example.com" subject="x">#value2#</cfmail>
<cffunction name="func" output="yes">#value2#</cffunction>    

in an attribute value of any coldfusion tag
<cfset dsn = "myDB"/>
<cfquery name="qryUsers" datasource="#dsn#">

<cfset value1 = 5>
<cfset value2 = 10/>
<cfloop from="#value1#" to="#value2#" index="i">

<cfqueryparam value="#value1#" cfsqltype="cf_sql_integer"/>

Modifica

Una stravagante piccola cosa che ho appena notato che sembra incoerente è cicli condizionali consentono il nome della variabile da utilizzare con e senza segni #.

<cfset value1 = 5>

<cfloop condition = "value1 LTE 10">
    <cfoutput>#value1#</cfoutput><br>
    <cfset value1 += 1>
</cfloop>

<cfset value1 = 5>

<cfloop condition = "#value1# LTE 10">
    <cfoutput>#value1#</cfoutput><br>
    <cfset value1 += 1>
</cfloop>

Altri suggerimenti

Ecco quello che Adobe ha da dire in proposito:

Utilizzando segni numerici

Stringa interpolazione:

<cfset name = "Danny" />
<cfset greeting = "Hello, #name#!" />
<!--- greeting is set to: "Hello, Danny!" --->

Auto-sfuggito stringa di interpolazione in cfquery:

<cfset username = "dannyo'doule" ?>
<cfquery ...>
    select u.[ID]
    from [User] u
    where u.[Username] = '#username#'
</cfquery>
<!--- the query is sent to the server (auto-escaped) as: --->
<!--- select u.[ID] from [User] u where u.[Username] = 'dannyo''doule' --->
<!--- note that the single-quote in the username has been escaped --->
<!--- by cfquery before being sent to the database server --->

Passaggio di argomenti complessi / attributi CFML:

<cfset p = StructNew() />
<cfset p.firstName = "Danny" />
<cfset p.lastName = "Robinson" />
<cfmodule template="modules/view/person.cfm" person="#p#">
<!--- the variable Attributes.person will be --->
<!--- available in modules/view/person.cfm --->

Passaggio di argomenti complessi richiede # Signes solo in CFML, non cfscript. In aggiunta, è possibile passare qualsiasi tipo di valore:. Valori semplici, gli array, le strutture, cfcomponents, cffunctions, oggetti Java, gli oggetti COM, etc

In tutti questi casi, il testo tra le <=> segni non deve essere il nome di una variabile . In realtà, può da qualsiasi espressione. Naturalmente, per interpolazione stringa, l'espressione deve essere un valore semplice, ma per argomento / attributo passando CFML, l'espressione può restituire qualsiasi valore complesso pure.

Il #...# sintassi permette di inserire l'espressione all'interno di una stringa letterale. ColdFusion è purtroppo abbastanza incoerente su ciò che è una stringa e ciò che è un'espressione. Jayson fornito una buona lista di esempi di quando usare ( o non usare) #s.

A rischio di sembrare come un saggio-guy, una regola generale è: uso # around variabili o espressioni solo quando non così facendo non produce il risultato corretto . Oppure:., Se non hai bisogno di loro, non li usa

Mi piace la risposta di Jayson però.

Partiamo dal presupposto che non sta parlando di tag cfoutput, provoca allora la risposta è sempre, altrove nel codice, se si è all'interno di virgolette, quindi bisogno di usare simboli # se è possibile digitare in realtà il valore che sta per essere usato ... quindi se siete in un tag cfloop impostando la 'a' attributo, si potrebbe facilmente tipo 6, ma se si desidera utilizzare una variabile è necessario utilizzare i simboli #. Ora, se siete in un tag cfloop l'impostazione del parametro di query, non c'è modo si potrebbe effettivamente digitare la query in tale attributo, non c'è modo di digitare una query, quindi non sono necessarie simboli #.

Allo stesso modo in un tag cfdump, è possibile scaricare il testo statico, quindi se si desidera eseguire il dump il contenuto di una variabile, allora si avrà bisogno di utilizzare un simbolo #. Questo problema è in genere auto-correzione, ma mi sento il vostro dolore, gli studenti sono probabilmente frustrati che non c'è "SEMPRE usarli" o "NEVER usarli" approccio ... purtroppo questo non è il caso, l'unica cosa che è vero, è solo un modo all'interno delle virgolette sta per essere corretto. Quindi, se non è guardare lavorando alla difficile e lunga e pensare a te stesso: "Posso scrivere che il valore fuori invece di utilizzare il valore contenuto in tale variabile?" Se la risposta è no, allora non saranno necessari i simboli #, altrimenti ottenere il vostro personaggio # foo via.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top