Вопрос

Это было одним из самых больших препятствий в обучении новых людей ColdFusion.

Когда использовать #, в лучшем случае неоднозначно.Поскольку их использование не часто создает проблемы, кажется, что большинство людей склонны использовать их слишком часто.

Итак, каковы основные правила?

Это было полезно?

Решение

Я думаю, может быть, проще сказать, где НЕ использовать #.Единственное место находится в операторах cfif и cfset, где вы не используете переменную для построения строки в кавычках.Вам нужно было бы использовать знак # почти во всех других случаях.

Пример того, где вы не собираетесь его использовать:

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

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

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

Примеры того, где вы будете использовать #:

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

Редактировать:

Одна странная мелочь, которую я только что заметил, которая кажется непоследовательной, - это условные циклы, позволяющие использовать имя переменной со знаками # и без них.

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

Другие советы

Вот что Adobe может сказать по этому поводу:

Использование цифровых знаков

Интерполяция строк:

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

Автоматически экранируемая интерполяция строк в 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 --->

Передача сложных аргументов / атрибутов в 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 --->

Передача сложных аргументов требует # подписывается только в CFML, а не в CFScript.Кроме того, вы можете передавать значения любого типа:простые значения, массивы, структуры, cfcomponents, cffunctions, java-объекты, com-объекты и т.д.

Во всех этих случаях текст между # знаки делают нет должны быть самыми имя переменной.На самом деле, это может быть сделано в любом выражении.Конечно, для интерполяции строк выражение должно принимать простое значение, но для передачи аргумента / атрибута в CFML выражение также может принимать любое сложное значение.

Тот Самый #...# синтаксис позволяет вам встроить выражение в строковый литерал.К сожалению, ColdFusion довольно непоследователен в том, что такое строка и что такое выражение.Джейсон предоставил хороший список примеры о том, когда использовать (или не использовать) #ы.

Рискую показаться умником, но эмпирическое правило таково: используйте # вокруг переменных или выражений только тогда, когда нет это не приводит к правильному результату.Или:если они вам не нужны, не используйте их.

Однако мне нравится ответ Джейсона.

Давайте начнем с предположения, что вы говорите не о тегах cfoutput, потому что тогда ответ всегда будет в другом месте вашего кода, если вы заключены в кавычки, тогда нужно использовать символы #, если на самом деле возможно ввести значение, которое будет used...so если вы в теге cfloop устанавливаете атрибут 'to', вы могли бы легко ввести 6, но если вы хотите использовать переменную, вам нужно использовать символы #.Теперь, если вы находитесь в теге cfloop, устанавливающем параметр запроса, вы не сможете фактически ввести запрос в этот атрибут, нет способа ввести запрос, поэтому символы # не нужны.

Аналогично, в теге cfdump вы можете выводить статический текст, поэтому, если вы хотите вывести содержимое переменной, вам нужно будет использовать символ #.Эта проблема, как правило, самокорректируется, но я чувствую вашу боль, ваши ученики, вероятно, разочарованы тем, что не существует подхода "ВСЕГДА ИСПОЛЬЗУЙТЕ ИХ" или "НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ИХ"...к сожалению, это не так, единственное, что верно, это то, что только один способ внутри кавычек будет правильным.Так что, если это не работает, посмотрите на это пристально и долго и подумайте про себя:"Могу ли я ввести это значение вместо использования значения, содержащегося в этой переменной?" Если ответ отрицательный, то символы # не понадобятся, в противном случае включите # character foo .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top