0

我试图在 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().

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

4

3 回答 3

1

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

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

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

于 2013-10-17T13:44:33.803 回答
0

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

如果我多次需要该值,我首先将其设为本地值。正如您在示例 1 中所做的那样。

于 2013-10-17T13:28:35.797 回答
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 = 二, 3 = 四)

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

现在,一切都解决了。我建议你看看 Ke Carltons 对 tagswap 的最新补充。它将比您尝试创建一堆动态变量更好地解决相同的问题:

www.lassosoft.com/tagswap/detail/web_request_params

于 2013-10-17T13:51:47.250 回答