结构中反复填充重复数据

时间:2015-06-26 22:46:02

标签: recursion coldfusion

请考虑以下代码:

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

现在,当这次运行时,我得到一个包含两个键messagestatus的结构输出。这是来自getCorrectionList函数内的转储。

然后我使用键enrollmentsmessagestatus获得第二个struct输出。 enrollments键内部是另一个包含enrollmentsmessagestatus的结构。在enrollments键内部是具有相同键的另一个结构,所以50次,最后一个结构为空。

似乎有些递归动作正在进行但是在哪里/如何?

我不知道发生了什么事。从我的代码中可以看出,没有循环。我知道URL正确解析,它返回一个查询并有一个记录数。我可以在正确的位置看到数据转储。但是,函数中的#result#如何显示单个结构,但函数外部的#result#如何显示重复的结构。它没有任何意义。

1 个答案:

答案 0 :(得分:2)

我不知道为什么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成为离散变量,而不仅仅是对调用代码的另一个引用&#39; result变量。

你应该总是本地化你的函数变量,除非你特意指的是引用一个调用代码变量,在这种情况下,如果你明确地将它作为明确的范围,它会使你的代码变得清晰意思是,例如:

<cfset variables.result = {} />

但这不是 你在这里做的意思。本地化您的函数变量。