Рассмотрим следующий код: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 глубокую структуру, повторяющуюся. Это не имеет никакого смысла.
(Изменить) Это потому, что вы используете структурную переменную с именем «результат» как внутри, так и снаружи функции. Поскольку переменная внутри функции не локализована, вы по существу захватываете результат функции - внутри себя. Таким образом, создается круговая ссылка. Отсюда свалка. Решение состоит в локализации локальных переменных функции. Интересно, что это происходит только в CF. Я видел, что нехватка видимости делает некоторые странные вещи, но это новый ;-) – Leigh
Чтобы уточнить, код фактически не заполняет структуру много раз. Это просто так, потому что CFDump не может разрешить круговую ссылку при представлении значений. – Leigh
Вам нужно 'var' переменную с именем' result' - но я бы предложил использовать для нее другое имя ... и 'var' it. –