我试图在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可用的最有效方法是什么?
感谢您的时间和帮助。
答案 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。它会像你试图创建一堆动态变量一样更好地解决同样的问题: