我一直在玩小马阵列以更好地理解小马,并想为任何数组编写地图功能。
我说的是类似标准地图功能的内容,如今大多数语言都具有转换集合的元素,如clojure:
(map #(+ 1 %) [1 2 3]) ; => [2 3 4]
,但我希望它实际修改给定数组,而不是返回新数组。
到目前为止,由于功能,我目前的尝试遇到了许多错误:
// array is "iso" so I can give it to another actor and change it
let my_array: Array[U64] iso = [1; 2; 3; 4]
// other actor tries to recover arrays as "box" just to call pairs() on it
let a = recover box my_array end // ERROR: can't recover to this capability
for (i, item) in a.pairs() do
// TODO set item at i to some other mapped value
try my_array.update(i, fun(item))? end
end
任何人都知道如何完成
好吧,花了我一段时间,但是我能够使事情正常工作。
这是我对发生的事情的基本理解(如果我错了,请纠正我!
第一步是了解我们需要使用别名来改变小马中变量的功能。
因此,为了使ISO变量可作为一个框使用,必须通过基本上将其消耗到另一个变量中来使其相反:
let a: Array[U64] ref = consume array // array is "iso"
for (i, item) in a.pairs() do
try a.update(i, item + n)? end
end
这有效!
我遇到的另一个问题是,我对由此产生的Array[U64] ref
做不到。不能将其传递给任何人。
因此,我将整个东西包裹到recover
块中,以最终以相同的数组,但作为val
(对数组的不可分割的引用),这更有用,因为我可以将其发送给其他参与者:
let result = recover val
let a: Array[U64] ref = consume array
for (i, item) in a.pairs() do
try a.update(i, item + n)? end
end
a
end
现在我可以将result
发送给任何人!