2015-06-26 3 views
2

Рассмотрим следующий код:Struct заселяется с повторяющимися данными снова и

<cfset result.enrollments = {} /> 
<cfset result.enrollments = getCorrectionList(SESSION.id,SESSION.term) /> 
<cfdump var="#result#" /><Cfabort/> 


<cffunction name="getCorrectionList"> 
    <cfargument name="id" required="true" type="string" /> 
    <cfargument name="term" required="true" type="numeric" default="#getCurrentSemester().code#" /> 

     <cfset result = {} /> 
     <cfset result.status = 500 /> 
     <cfset result.message = 'Unknown Error' /> 

     <cfhttp url="THERE IS A REAL URL HERE" /> 
     <cfif cfhttp.statusCode EQ '200 OK'> 
      <cfset courses = deserializeJson(cfhttp.fileContent,false) /> 

      <cfif courses.recordCount EQ 0> 
       <cfset result.message = 'You are not currently enrolled in any courses for #ARGUMENTS.term#' /> 
       <cfdump var="#result#" /> 
       <cfreturn result /> 
      </cfif> 
<!--- MORE STUFF ---> 

Теперь, когда это работает я получаю один выход STRUCT с двумя ключами message и status. Это из дампа внутри функции getCorrectionList.

Затем я получаю второй вывод структуры с помощью клавиш enrollments, message и status. Внутри ключа enrollments находится другая структура с enrollments, message и status. Внутри этого ключа enrollments находится другая структура с теми же клавишами и так далее 50 раз, когда последняя структура пуста.

Кажется, что происходит какое-то рекурсивное действие, но где/как?

Я понятия не имею, что происходит. Как видно из моего кода, циклов нет. Я знаю, что URL-адрес разрешен правильно, и он возвращает запрос и имеет показатель записи. Я могу видеть дамп данных в правильных местах. Но как может #result# в функции показать одну структуру, но #result# вне функции показывает 50 глубокую структуру, повторяющуюся. Это не имеет никакого смысла.

+3

(Изменить) Это потому, что вы используете структурную переменную с именем «результат» как внутри, так и снаружи функции. Поскольку переменная внутри функции не локализована, вы по существу захватываете результат функции - внутри себя. Таким образом, создается круговая ссылка. Отсюда свалка. Решение состоит в локализации локальных переменных функции. Интересно, что это происходит только в CF. Я видел, что нехватка видимости делает некоторые странные вещи, но это новый ;-) – Leigh

+0

Чтобы уточнить, код фактически не заполняет структуру много раз. Это просто так, потому что CFDump не может разрешить круговую ссылку при представлении значений. – Leigh

+0

Вам нужно 'var' переменную с именем' result' - но я бы предложил использовать для нее другое имя ... и 'var' it. –

ответ

2

Я не знаю, почему ни Ли, ни Скотт на самом деле не ответили на их комментарии, но они оба правы.

У вас есть эта ссылка на result за пределами функции:

<cfset result.enrollments = getCorrectionList(SESSION.id,SESSION.term) /> 

И в конце вашей функции вы это делаете:

<cfreturn result /> 

Что в действительности означает, что вы делаете это:

<cfset result.enrollments = result /> 

Значение result.enrollments является ссылкой на его собственное родительское result.

И <cfdump> должным образом отображает круглую ссылку.

Как они оба сказали, что вам нужно, чтобы локализовать переменные внутри функции, либо var их ING:

<cfset var result = {} /> 

Или явно помещая их в local объеме:

<cfset local.result = {} /> 

Это будет сделайте функцию result дискретной переменной, а не просто ссылкой на код вызывающего кода «result».

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

<cfset variables.result = {} /> 

Но это не то, что вы смысл сделать здесь. Локализовать переменные вашей функции.

+0

IMO, «хорошие ответы» должны иметь немного больше вещества (и в идеале примеры), чем мои комментарии. Я решил снять ночь, но надеялся, что ты сможешь появиться и отправить более надежный ответ на этот вопрос, в то же время ... ты не разочаровал ;-) – Leigh

+0

Хех, справедливо. Я считаю, что ваш комментарий был достаточно тщательным, но он пошел и заставил меня написать * еще больше *, чтобы фактически добавить значение в ответ. –

+0

У меня создалось впечатление, что внутри функции CF10 локализованы переменные по умолчанию, и это не было необходимо для этого. Я предполагаю, что это так, но поскольку у меня уже есть результат вне функции, он использует эту ссылку, а не создает новую? – Leeish

Смежные вопросы