这是我需要在Chapel中重新创建的类似Python的模式。
class Gambler {
var luckyNumbers: [1..0] int;
}
var nums = [13,17,23,71];
var KennyRogers = new Gambler();
KennyRogers.luckyNumbers = for n in nums do n;
writeln(KennyRogers);
产生运行时错误
Kenny.chpl:8: error: zippered iterations have non-equal lengths
我不知道Kenny会提前有多少幸运数字,而我当时无法实例化Kenny。也就是说,我必须稍后再分配它们。另外,我需要知道何时抓住它们,知道何时折叠它们。
答案 0 :(得分:4)
这是array.push_back
方法的一个很好的应用。要一次插入一个幸运数字,您可以这样做:
for n in nums do
KennyRogers.luckyNumbers.push_back(n);
您还可以在一个push_back
操作中插入整个数组:
KennyRogers.luckyNumbers.push_back(nums);
如果您需要将元素放在数组的前面或任意位置,还有push_front
和insert
方法。
我不认为我可以帮助何时抓住它们或何时折叠它们。
答案 1 :(得分:2)
一种方法,只需从一开始就使大小合适,避免调整大小/重写数组,就是在luckyNumbers
的初始值设定项中建立Gambler
。为了在不调整大小的情况下执行此操作,您需要声明数组的域并将其设置在初始值设定项中:
class Gambler {
const D: domain(1); // a 1D domain field representing the array's size
var luckyNumbers: [D] int; // declare lucky numbers in terms of that domain
proc init(nums: [?numsD] int) {
D = numsD; // make D a copy of nums's domain; allocates luckyNumbers to the appropriate size
luckyNumbers = nums; // initialize luckyNumbers with nums
super.init(); // mark the initialization of fields as being done
}
}
var nums = [13,17,23,71];
var KennyRogers = new Gambler(nums);
writeln(KennyRogers);