一遍又一遍地填充重复数据的结构
Struct being populated with duplicate data over and over
考虑以下代码:
<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 --->
现在,当它运行时,我得到一个带有两个键 message
和 status
的结构输出。这是来自 getCorrectionList
函数内部的转储。
然后我得到第二个结构输出,其中包含键 enrollments
、message
和 status
。在 enrollments
键内是另一个结构 enrollments
、message
和 status
。在 enrollments
键内是另一个具有相同键的结构,依此类推 50 次,最后一个结构为空。
似乎正在进行一些递归操作,但是 where/how?
我不知道发生了什么。正如您从我的代码中看到的那样,没有循环。我知道 URL 正确解析并且它 returns 是一个查询并且有一个记录数。我可以在正确的位置看到数据转储。但是函数中的 #result#
怎么会显示单个结构,而函数外部的 #result#
怎么会显示一个 50 深的结构重复自己。这没有任何意义。
我不知道为什么 Leigh 或 Scott 都没有真正回答他们的评论,但他们都是对的。
您在函数外引用了 result
:
<cfset result.enrollments = getCorrectionList(SESSION.id,SESSION.term) />
在你的函数结束时你这样做:
<cfreturn result />
这实际上意味着您正在这样做:
<cfset result.enrollments = result />
意思是 result.enrollments
是对其父 result
的引用。
并且 <cfdump>
正确显示循环引用。
正如他们所说,您需要通过 var
对它们进行本地化:
<cfset var result = {} />
或者明确地将它们放在 local
范围内:
<cfset local.result = {} />
这将使函数的 result
成为离散变量,而不仅仅是调用代码的另一个引用 result
变量。
你应该总是 本地化你的函数变量,除非你特别想引用一个调用代码变量,在这种情况下,如果你明确地将它的范围限定为让你的意思一目了然,例如:
<cfset variables.result = {} />
但这不是您在这里的意思。本地化函数的变量。
考虑以下代码:
<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 --->
现在,当它运行时,我得到一个带有两个键 message
和 status
的结构输出。这是来自 getCorrectionList
函数内部的转储。
然后我得到第二个结构输出,其中包含键 enrollments
、message
和 status
。在 enrollments
键内是另一个结构 enrollments
、message
和 status
。在 enrollments
键内是另一个具有相同键的结构,依此类推 50 次,最后一个结构为空。
似乎正在进行一些递归操作,但是 where/how?
我不知道发生了什么。正如您从我的代码中看到的那样,没有循环。我知道 URL 正确解析并且它 returns 是一个查询并且有一个记录数。我可以在正确的位置看到数据转储。但是函数中的 #result#
怎么会显示单个结构,而函数外部的 #result#
怎么会显示一个 50 深的结构重复自己。这没有任何意义。
我不知道为什么 Leigh 或 Scott 都没有真正回答他们的评论,但他们都是对的。
您在函数外引用了 result
:
<cfset result.enrollments = getCorrectionList(SESSION.id,SESSION.term) />
在你的函数结束时你这样做:
<cfreturn result />
这实际上意味着您正在这样做:
<cfset result.enrollments = result />
意思是 result.enrollments
是对其父 result
的引用。
并且 <cfdump>
正确显示循环引用。
正如他们所说,您需要通过 var
对它们进行本地化:
<cfset var result = {} />
或者明确地将它们放在 local
范围内:
<cfset local.result = {} />
这将使函数的 result
成为离散变量,而不仅仅是调用代码的另一个引用 result
变量。
你应该总是 本地化你的函数变量,除非你特别想引用一个调用代码变量,在这种情况下,如果你明确地将它的范围限定为让你的意思一目了然,例如:
<cfset variables.result = {} />
但这不是您在这里的意思。本地化函数的变量。