Lasso 9挂起将地图值插入阵列?

时间:2014-01-31 03:07:36

标签: lasso

编辑:在尝试削减示例代码时,我不小心误解了问题。我的代码的一个关键部分是我在向它添加元素后尝试对数组进行排序。挂起出现在 sort 上,而不是插入。以下抽象代码将一直挂起:

<?=

local('a' = array)

#a->insert('test1' = map('a'='1'))
#a->insert('test2' = map('b'='2')) // comment-out to make work

#a->sort

#a

?>

我有一个结果集,我想为每个唯一键将一对值插入数组,如下所示:

resultset(2) => {
    records => {
        if(!$logTypeClasses->contains(field('logTypeClass'))) => {
            local(i) = pair(field('logTypeClass'), map('title' = field('logType'), 'class' = field('logTypeClass')))
            log_critical(#i)
            $logTypeClasses->insert(#i) // Lasso hangs on this line, will return if commented-out
        }
    }
}

奇怪的是,在没有Lasso挂起的情况下,我无法将#i局部变量插入到线程变量中。我从未收到错误,页面永远不会返回。它只是无限期地挂起。

我确实看到对被正确记录,这让我相信产生对的语法是正确的。

只要对的值侧不是带值的映射,我就可以使代码工作。换句话说,当对的值侧是字符串,甚至是空映射时,它都有效。只要我将key = value参数添加到地图中,它就会失败。

我必须遗漏一些明显的东西。有什么指针吗?提前感谢您的时间和考虑。

2 个答案:

答案 0 :(得分:1)

我怀疑你的问题是地图构造本身的配对。 此测试代码按预期工作:

var(testcontainer = array)

inline(-database = 'mysql', -table = 'help_topic', -findall) => {
    resultset(1) => {
        records => {
            if(!$testcontainer->contains(field('name'))) => {
                local(i) = pair(field('name'), map('description' = field('description'), 'name' = field('name')))
                $testcontainer->insert(#i)
            }
        }
    }
}
$testcontainer

当Lasso像这样挂起而没有任何反馈并且没有立即崩溃时,它通常被困在某种无限循环中。我猜测它可能与Lasso尽可能使用引用有关。也许您的代码的某些部分使用引用自身的引用。或者其他什么。

答案 1 :(得分:1)

我可以使用排序发送的基本代码来验证错误。问题确实出现了如何对一对进行排序。我打赌你希望它们按照对中的第一个元素排序,但我也可以看到它们应该按对中的最后一个元素排序(按值而不是按键)

可能更好的一件事是将其保存为地图地图。如果由于某种原因需要排序数据,可以执行map-&gt; keys-&gt; asArray-&gt; sort

例如:

local(data) = map('test1' = map('a'=2,'b'=3))
#data->insert('test2' = map('c'=33, 'd'=42))

local(keys) = #data->keys->asArray
#keys->sort
#keys

更好的是,如果您要遍历排序集,则可以使用查询表达式:

local(data) = map('test1' = map('a'=2,'b'=3))
#data->insert('test2' = map('c'=33, 'd'=42))

with elm in #data->eachPair
let key   = #elm->first
let value = #elm->second
order by #key
do { ... }