如何使用括号表示法访问范围?

时间:2012-08-10 13:11:00

标签: syntax coldfusion scope

作为函数的输入,我得到一个字符串范围名称,如FORMCOOKIE。 如何以括号表示法访问这些顶级作用域?

我正在寻找类似的东西:

var myScope = "FORM";
global[myScope];

显然这不起作用:)

(我不是在寻找任何类型的eval函数,我宁愿switch通过字符串手动获取正确的范围而不是eval函数...)

修改

需要功能,所以我可以在请求的早期调用一个简单/可访问的函数来识别发送错误类型数据或者不发送所需数据的错误请求。

例如,我将在需要变量FORM.data1:numericFORM.data2:bitCOOKIE.data3:string的请求中尽早调用以下函数:

<cfset require({
  "FORM" : {
    "data1":"numeric",
    "data2":"bit"
  },
  "COOKIE":{
    "data3":"string"
  } 
})>

我知道以下内容可能更容易一些:

<cfset require({
  "FORM.data1":"numeric",
  "FORM.data2":"bit",
  "COOKIE.data3":"string"
})>

而不仅仅是使用isDefined,但我需要更多的灵活性来实现其他功能。

3 个答案:

答案 0 :(得分:5)

您可以使用structGet()

var theformscope = structGet('form');

有关structGet的更多信息,请参阅ColdFusion文档:http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f03.html

答案 1 :(得分:1)

如果不使用Evaluate函数,我认为不可能。可以说,范围处于链的顶层,因此在它们之前没有点符号。

答案 2 :(得分:1)

嗯,最简单的解决方案就是这样写:

<cfparam name="form.data1"   type="numeric" />
<cfparam name="form.data2"   type="numeric" />
<cfparam name="cookie.data3" type="string" />


但是,如果您发现过于冗长,则可以使用现有的数据结构,如下所示:

<cfset require({
  "FORM" : {
    "data1":"numeric",
    "data2":"bit"
  },
  "COOKIE":{
    "data3":"string"
  } 
})>


<cffunction name="require" returntype="void" output=false >
    <cfargument name="Scopes" type="Struct" required />

    <cfloop item="local.CurScope" collection=#Arguments.Scopes#>
        <cfloop item="local.CurVar" collection=#Arguments.Scopes[CurScope]#>
            <cfparam name="#CurScope#.#CurVar#" type="#Arguments.Scopes[CurScope][CurVar]#" />
        </cfloop>
    </cfloop>
</cffunction>


或者,有一种比这更简单的方法:

<cfset require
    ( "FORM.data1"   : "numeric"
    , "FORM.data2"   : "bit"
    , "COOKIE.data3" : "string"
    )>

<cffunction name="require" returntype="void" output=false >

    <cfloop item="local.ArgName" collection=#Arguments#>
        <cfparam name="#ArgName#" type="#Arguments[ArgName]#" />
    </cfloop>

</cffunction>

您暗示您需要其他功能的无范围名称,在这种情况下,您只需执行<cfset UnscopedName = ListRest(ArgName,'.') />