如何访问条件内部数组内的#1 - > forEach

时间:2013-10-17 13:20:41

标签: lasso

我试图在Lasso 9中学习捕获,但我正在努力弄清楚如何从#1捕获中的条件内访问array->forEach局部变量。也许我的方法都错了。是否有我需要使用的父捕获的引用?以下是工作代码:

define paramstovars() => {

    local(p = web_request->params)

    #p->foreach => {
        local(i = #1)
        if(#i->type == 'pair') => {
            var(#i->first->asstring = #i->second->asstring)
        }
    }

}

以下是我试图在不依赖冗余局部变量定义的情况下工作的代码:

define paramstovars() => {

    local(p = web_request->params)

    #p->foreach => {
        if(#1->type == 'pair') => {
            var(#1->first->asstring = #1->second->asstring)
        }
    }

}

在第二个示例中,我在调用var()的行上收到错误 Position超出范围:1 max是0(错误代码-1)

除了这种自定义方法明显的安全问题之外,在嵌套条件中使#1可用的最有效方法是什么?

感谢您的时间和帮助。

3 个答案:

答案 0 :(得分:1)

#1在每次捕获中被替换 - 所以是的,你需要将它分配给另一个本地,以便在更深的捕获中使用它。如果您需要再次使用本地,请尝试使用查询表达式:

 with i in web_request->params do {
    if(#i->type == 'pair') => {
        var(#i->first->asstring = #i->second->asstring)
    }
}

此外,我不建议以这种方式设置变量 - 它存在安全风险。最好将参数存储在单个变量中,然后可能从中设置特定变量。这里有一组类似的标签:getparam / postparam

答案 1 :(得分:0)

根据我的经验,第一次呼叫时会消耗#1。至少我从来没有能够在同一次捕获中调用它两次。

如果我不止一次需要这个值,我先把它作为本地的。正如您在示例1中所做的那样。

答案 2 :(得分:0)

稍后进行一些实验。

你可以多次调用#1,这与我写的相反,但你努力的结果是你在捕获中有一个捕获(条件)。 第二次捕获将拥有它自己的输入参数。

这是一个经过实践检验的例子来做你想做的事情:

local(
    myarray = array(1, 2 = 'two', 3 = 'four', 4),
    mypairs = map
)

#myarray -> foreach => {
    if(#1-> isa(::pair)) => {
        #mypairs -> insert(#1 -> first -> asstring = #1 -> second -> asstring)
    }(#1)
}
#my pairs

结果将是map(2 = 2,3 = 4)

诀窍是将foreach参数发送到条件捕获:`{some code}(#1)

现在,一切顺利。我建议你看一下Ke Carltons最新添加的tagswap。它会像你试图创建一堆动态变量一样更好地解决同样的问题:

www.lassosoft.com/tagswap/detail/web_request_params