Pregunta

Este ha sido uno de los mayores obstáculos para enseñar a los nuevos ColdFusion.

Cuando usar # es ambigua en el mejor. Dado que su uso no muy a menudo no crear un problema que parece que la mayoría de sus habitantes acuden a usarlos demasiado.

Así que, ¿cuáles son las reglas básicas?

¿Fue útil?

Solución

Creo que puede ser más fácil de decir dónde no utilizar #. El único lugar está en declaraciones CFIF y cfset declaraciones en las que no está utilizando una variable para construir una cadena entre comillas. Usted tendría que utilizar el signo # en casi todos los otros casos.

Ejemplo de donde no se va a utilizar es el siguiente:

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

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

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

Los ejemplos de dónde va a utilizar #:

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"/>

EDIT:

Una excéntrica pequeña cosa que acabo de notar que parece inconsistente es bucles condicionales permiten que el nombre de la variable que se utilizará con y sin signos #.

<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>

Otros consejos

Esto es lo que Adobe tiene que decir al respecto:

El uso de signos de número

interpolación de cadenas:

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

Auto-escapado interpolación de cadenas de 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 --->

Paso de argumentos complejos / atributos CFML en:

<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 --->

Paso de argumentos complejos requiere # Signes sólo en CFML, no CFScript. Además, puede pasar cualquier tipo de valor:. Los valores simples, matrices, estructuras, cfcomponents, cffunctions, objetos Java, objetos COM, etc.

En todos estos casos, el texto entre los signos <=> hace no tiene que ser el nombre de una variable . De hecho, puede ser cualquier expresión. Por supuesto, para la interpolación de cadenas, la expresión debe evaluarse como un valor simple, pero para el argumento / atributo que pasa en CFML, la expresión puede evaluar a cualquier valor complejo también.

El #...# sintaxis permite incrustar una expresión dentro de una cadena literal. ColdFusion es por desgracia muy contradictoria sobre lo que es una cadena y lo que es una expresión. Jayson proporciona una buena lista de ejemplos de cuándo utilizar ( o no utilizar) #s.

A riesgo de sonar como un sabelotodo, una regla de oro es: uso # torno a variables o expresiones sólo cuando no hacerlo no produce el resultado correcto . O:. Si no los necesita, no usarlos

Me gusta la respuesta de Jayson sin embargo.

Vamos a empezar asumiendo que no está hablando acerca de las etiquetas cfoutput, porque entonces la respuesta es siempre, en otra parte de su código, si se encuentra dentro de las comillas, entonces es necesario utilizar símbolos # si es posible en realidad escribir el valor que va a ser utilizado ... así que si usted está en un ajuste de la 'a' atributo de etiqueta cfloop, fácilmente se podría escribir 6, pero si desea utilizar una variable que tenga que utilizar los símbolos #. Ahora bien, si usted está en un ajuste del parámetro de consulta etiqueta cfloop, no hay manera de que realmente puede escribir la consulta en ese atributo, no hay manera de escribir una consulta, por lo que no se necesitan símbolos #.

Del mismo modo, en una etiqueta cfdump, se puede volcar el texto estático, por lo que si desea volcar el contenido de una variable, entonces usted tendrá que utilizar un símbolo #. Este problema es generalmente auto-corrección, pero siento su dolor, sus estudiantes son probablemente frustrados que no hay "SIEMPRE usarlos" o "Nunca los use" enfoque ... por desgracia no es el caso, lo único que es cierto, es sólo una forma dentro de las comillas va a ser correcta. Así que si no está trabajando en el aspecto duro y largo y piensa a sí mismo: "¿Podría escribir ese valor a cabo en lugar de utilizar el valor contenido en la variable?" Si la respuesta es no, entonces no serán necesarios los símbolos #, de otro modo obtener su carácter # foo sucesivamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top