2009-07-01 25 views
14

Este ha sido uno de los mayores obstáculos en la enseñanza de la gente nueva de ColdFusion.¿Cuándo debería usar # en ColdFusion?

Cuándo utilizar # es ambigua en el mejor. Dado que usarlos a menudo no crea un problema, parece que la mayoría de la gente tiende a usarlos demasiado.

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

+1

Toma un poco de tiempo aprender las reglas. Pero en realidad no necesita usarlo demasiado, y le recomendaría tratar de averiguar cuándo realmente necesita usarlo, y no lo use cuando no lo necesite. Ver mi respuesta a continuación. – yfeldblum

Respuesta

13

Creo que puede ser más fácil de decir dónde no utilizar #. El único lugar está en declaraciones cfif y declaraciones de cfset donde no está usando una variable para construir una cadena entre comillas. Debería usar el signo # en casi todos los demás casos.

ejemplo de que no se va a utilizar:

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

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

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

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="[email protected]" from="[email protected]" 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 Recién notado que parece inconsistente, los bucles condicionales permiten que el nombre de la variable se use 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> 
+0

CFLOOP tampoco lo necesita para el parámetro de consulta, mientras que CFDUMP sí lo necesita. No completamente consistente. –

+1

CFLOOP espera el/nombre/de una consulta. Entonces, si usa #s en el atributo de consulta de CFLOOP, debe evaluar a una cadena que es un nombre de variable que hace referencia a un objeto de consulta. –

3

La sintaxis #...# permite incrustar una expresión dentro de una cadena literal. ColdFusion desafortunadamente es bastante inconsistente sobre lo que es una cadena y qué es una expresión. Jayson proporcionó una buena lista de examples de cuándo usar (o no usar) #s.

+3

La tendencia al uso excesivo de # ... # probablemente se debe al hecho de que muchas personas tienen dificultades para decidir qué es una expresión y qué es una cadena literal, y que CF es tan indulgente con el uso redundante: funciona, y también funciona, pero en ambos casos ## son redundantes. – Tomalak

7

Esto es lo que Adobe tiene que decir al respecto:

Using number signs

+2

+1, pero eso está un poco desactualizado. Por ejemplo, dice que los signos de libra solo pueden contener variables o funciones o variables. Eso ya no es verdad. Cualquier expresión (como # 1 + 1 #) funciona al menos desde CF7. –

+0

No importa. Actualicé el enlace a la versión CF8 del mismo documento. –

5

cadena de interpolación:

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

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

Pasando un borrador los argumentos lex requieren # signes solo en CFML, no en CFScript. Además, puede pasar cualquier tipo de valor: valores simples, matrices, estructuras, cfcomponents, cffunctions, objetos de Java, objetos COM, etc.

En todos estos casos, el texto entre los signos # qué no tienen a ser el nombre de una variable . De hecho, puede hacerlo con 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.

1

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

Me gusta la respuesta de Jayson.

0

Comencemos suponiendo que no estamos hablando de etiquetas cfoutput, porque entonces la respuesta es siempre, en otras partes de su código, si está entre comillas, entonces necesita usar símbolos # si es posible escribir el valor que se va a usar ... así que si está en una etiqueta cfloop configurando el atributo 'to', puede escribir fácilmente 6, pero si desea usar una variable, necesita usar los símbolos #. Ahora bien, si está en una etiqueta cfloop configurando el parámetro de consulta, no hay manera de que pueda escribir la consulta en ese atributo, no hay forma de escribir una consulta, por lo que no se necesitan símbolos #.

Del mismo modo, en una etiqueta cfdump, puede volcar el texto estático, por lo que si desea volcar el contenido de una variable, tendrá que usar un símbolo #. Este problema generalmente se corrige a sí mismo, pero siento tu dolor, tus estudiantes probablemente se sienten frustrados de que no haya un enfoque de "SIEMPRE UTILIZARLOS" o "NUNCA UTILIZARLOS" ... lamentablemente este no es el caso, lo único que es cierto, solo una de las formas dentro de las comillas va a ser correcta. Entonces, si no está funcionando, fíjense bien y piense: "¿Podría escribir ese valor en lugar de usar el valor que contiene esa variable?" Si la respuesta es no, entonces los símbolos # no serán necesarios; de lo contrario, activa tu # personaje foo.

Cuestiones relacionadas