Можно ли передать простое значение по ссылке в ColdFusion? - PullRequest
3 голосов
/ 18 июля 2009

По умолчанию ColdFusion передает простые типы (например, числовые, строковые и GUID) по значению в функции. Я хотел бы передать простой тип по ссылке.

В настоящее время я оборачиваю простое значение в структуру (они передаются по ссылке). Это решает мою проблему, но это очень уродливо:

<!--- TheFunctionName---->
<cffunction name="TheFunctionName">
     <cfargument name="OutVariable" type="struct">
     <cfset OutVariable.ID = 5>
</cffunction>

<cfset OutVariable=StructNew()>
<cfset TheFunctionName(OutVariable)>

<!--- I want this to output 5--->
<cfoutput>#OutVariable.ID#</cfoutput>

Я бы предпочел что-то вроде этого:

<!--- TheFunctionName---->
<cffunction name="TheFunctionName">
     <cfargument name="OutVariable" passbyref="true">
     <cfset OutVariable = 5>
</cffunction>

<cfset TheFunctionName(OutVariable)>

<!--- I want this to output 5--->
<cfoutput>#OutVariable#</cfoutput>

Ответы [ 3 ]

8 голосов
/ 18 июля 2009

AFAIK, в ColdFusion невозможно передать простые значения по ссылке. Единственный обходной путь, о котором я могу подумать, это тот, который вы уже используете.

Вместо этого я бы предложил попробовать реструктурировать вашу программу, чтобы она работала с учетом языка. В тех случаях, когда есть только одно простое значение для «изменения», вы можете просто заставить вашу функцию возвращать новое значение и вызывать его следующим образом:

<cfset SomeVar = TheFunctionName(SomeVar)>

В тех случаях, когда вы изменяете несколько значений, сделайте шаг назад и подумайте, возможно ли объединить эти несколько значений в CFC, чтобы ваши функции-мутаторы стали методами CFC. В любом случае это может быть более понятным и более приемлемым решением.

1 голос
/ 18 июля 2009

Если вы:

  1. объявить функцию внутри CFC
  2. вызовите функцию, используя

Вы сможете указать параметр returnvariable, а затем вывести эту переменную так, как вам нравится.

<cfinvoke component="this" method="TheFunctionName" returnvariable="blah">
     <cfinvokeargument name="data" value="whatever" type="string">

     <cfreturn data>
</cfinvoke>

<cfdump var="#blah#">

Если вы пишете все в cfscript, то я бы согласился с тем, что сказал SurroundByFish.

1 голос
/ 18 июля 2009

Вы можете расположить переменные, используемые снаружи и внутри функции, в области видимости, которая существует в обеих областях кода. Например, если вы поместите переменную в область «сессия» или «запрос», вы сможете получить к ней доступ из функции. Внесенные изменения сохранятся.

Обратите внимание, что когда вы делаете это, вы на самом деле не "передаете" переменные в функцию. Функция просто предполагает, что переменная существует или создает ее, в зависимости от того, как вы ее кодируете.

<cffunction name="TheFunctionName">
     <cfset Request.StrVar = "inside function<br />" />
</cffunction>

<cfscript>
    Request.StrVar = "outside function<br />";
    WriteOutput(Request.StrVar);
    TheFunctionName();
    WriteOutput(Request.StrVar);
</cfscript>

Об областях применения ColdFusion

Если есть какие-либо сомнения относительно того, что вызывающая страница объявляет переменную заранее, когда это требуется, вам придется немного поработать с тегом или IsDefined () функция.

...