0

编辑:我在尝试缩减示例代码时不小心歪曲了这个问题。我的代码的一个关键部分是我在向数组添加元素后尝试对数组进行排序。挂起出现在sort上,而不是 insert 上。以下抽象代码将始终挂起:

<?=

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
        }
    }
}

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

我确实看到正确记录了对,这使我相信生成对的语法是正确的。

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

我一定遗漏了一些明显的东西。任何指针?提前感谢您的时间和考虑。

4

2 回答 2

1

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

可能会更好的一件事是将其保留为地图的地图。如果出于某种原因需要排序数据,可以执行 map->keys->asArray->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 { ... }
于 2014-01-31T13:53:22.260 回答
1

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

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 尽可能使用引用有关。也许您的代码的某些部分正在使用引用自身的引用。或者其他的东西。

于 2014-01-31T09:27:57.190 回答