Pergunta

Este tem sido um dos maiores obstáculos para ensinar novas pessoas ColdFusion.

Quando usar # é ambígua na melhor das hipóteses. Desde usá-los muitas vezes não criar um problema, parece que a maioria das pessoas gravitam em torno de usá-los muito.

Então, quais são as regras básicas?

Foi útil?

Solução

Eu acho que pode ser mais fácil dizer onde não usar #. O único lugar é em declarações CFIF e declarações CFSET onde você não está usando uma variável para construir uma string entre aspas. Você precisa usar o sinal # em quase todos os outros casos.

Exemplo de onde você está não vai usá-lo:

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

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

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

Exemplos de onde você vai usar #:

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:

Um excêntrico coisinha que eu só notei que parece inconsistente é laços condicionais permitem que o nome da variável a ser usada com e sem sinal #.

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

Outras dicas

Aqui está o que a Adobe tem a dizer sobre isso:

Usando sinais de número

string de interpolação:

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

Auto-escapou interpolação de string em 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 --->

Passando argumentos complexos / atributos em 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 --->

Passando argumentos complexos requer signes # única em CFML, não cfscript. Além disso, você pode passar qualquer tipo de valor:. Valores simples, matrizes, estruturas, cfcomponents, cffunctions, objetos java, com objetos, etc

Em todos estes casos, o texto entre os sinais # não tem que ser o nome de uma variável . Na verdade, ele pode por qualquer expressão. Claro que, para interpolação de string, a expressão deve ser avaliada como um valor simples, mas para o argumento / atributo passando em CFML, a expressão pode ser avaliada como qualquer valor complexo também.

A sintaxe #...# permite embutir uma expressão dentro de um literal string. ColdFusion é, infelizmente, muito inconsistente sobre o que é uma corda e que é uma expressão. Jayson desde uma boa lista de de quando usar ( ou não usar) #s.

Correndo o risco de soar como um cara-sábio, a regra de ouro é: uso # around variáveis ??ou expressões somente quando não isso não produz o resultado correto . Ou:. Se você não precisa deles, não usá-los

Eu gosto de resposta de Jayson embora.

Vamos começar assumindo que você não está falando sobre tags cfoutput, causa, então a resposta é sempre, em outro lugar no seu código, se você estiver dentro de aspas, então precisa usar símbolos # se é possível realmente digitar o valor que vai ser usado ... por isso, se você estiver em uma tag CFLOOP definindo o 'para' atributo, você poderia facilmente tipo 6, mas se você quiser usar uma variável que você precisa para usar os símbolos #. Agora, se você estiver em uma definição do parâmetro de consulta tag CFLOOP, não há nenhuma maneira que você realmente pode digitar a consulta em que atributo, não há nenhuma maneira de digitar uma consulta, por isso não são necessários símbolos #.

Da mesma forma, em uma tag cfdump, você pode despejar texto estático, então se você quiser jogar o conteúdo de uma variável, então você vai precisar usar um símbolo #. Este problema é geralmente auto-correção, mas eu sinto sua dor, seus alunos são, provavelmente frustrado que não há "sempre usá-los" ou "nunca usá-los" abordagem ... infelizmente este não é o caso, a única coisa que é verdade, é apenas um caminho dentro de aspas vai ser correto. Então, se não é olhar trabalhando com ele duro e longo, e pensar para si mesmo: "Eu poderia escrever esse valor para fora em vez de usar o valor contido nessa variável?" Se a resposta é não, então não será necessário os símbolos #, caso contrário, obter o seu # caráter foo por diante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top