如何从状态中获取列表并在 qore 中进行修改?

How can I get a list from state and modify it in qore?

我正在使用 ServiceApi::saveStateData({"my-key": some_list});将列表保存到我的 qorus IE 状态的方法。 我想问的是如何从状态中获取列表和列表中的 add/remove 元素并将其放回状态? 我也想知道如何加入列表?例如,我想加入 some_list 下的两个列表并将其置于 state?

提前感谢大家的帮助, 克里斯蒂

列表总是通过引用传递,即使列表有一个“伪class”(与 Qore 中的其他基本类型一样),所有方法都是只读的。

要更改列表,请使用 +=, +, push, splice, extract operator, unshift, and pop 运算符。

问:如何从列表中 add/remove 个元素?

选项 1:使用 extract 运算符删除元素:

prompt$: qore -ne 'list<auto> l = (1, 2, 3, 4); printf("removed: %y\n", (extract l, 1, 2)); printf("l: %y\n", l);'
removed: [2, 3]
l: [1, 4]

选项 2:使用带有范围的 remove 运算符来删除列表的一部分:

prompt$ qore -ne 'list<auto> l = (1, 2, 3, 4); printf("removed: %y\n", remove l[1..2]); printf("l: %y\n", l);'
removed: [2, 3]
l: [1, 4]

问:如何加入列表?

使用 +=, + 连接列表:

prompt$ qore -ne 'list<auto> l1 = (1, 2); list<auto> l2 = (3, 4); printf("new list: %y\n", l1 + l2);'
new list: [1, 2, 3, 4]
prompt$  qore -ne 'list<auto> l1 = (1, 2); list<auto> l2 = (3, 4); l1 += l2; printf("new list: %y\n", l1);'
new list: [1, 2, 3, 4]

注意,要将一个列表作为单个元素添加到另一个列表,最好使用 push 运算符:

qore -ne 'list<auto> l1 += (1, 2); list<auto> l2 = (3, 4); push l1, l2; printf("new list: %y\n", l1);'
new list: [1, 2, [3, 4]]

请注意,我在上面的原始赋值中使用了 += 以确保 l1 具有类型 list<auto> - 因为简单的赋值会导致 list<int> 这将导致 push 表达式抛出异常。

另请注意,由于列表是 Qore 中的基本类型,因此它们始终按值传递(从技术上讲,它们是使用写​​时复制语义按引用传递的),并且 "pseudo-class" for lists(与所有伪-classes in Qore) 只实现只读方法;在 Qore 中更新左值只能通过运算符完成。这是因为由于 Qore 的多线程特性,在 Qore 中更新左值很复杂。所有 Qore 运算符都是线程原子的,即使在复杂的表达式中,也只能使用保证一致性和原子性的运算符来更改左值。

上述情况的例外是对象,它们总是通过引用传递(实际上在技术上是引用的副本,类似于 Java);所有其他值类型均按值传递。