将数组分配给教堂 Class 中的 属性

Assign an array to a property in a Chapel Class

这是我需要在 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。也就是说,我必须稍后分配它们。另外,我需要知道什么时候持有它们,知道什么时候折叠它们。

这是array.push_back方法的一个很好的应用。要一次插入一个幸运数字,您可以这样做:

for n in nums do
  KennyRogers.luckyNumbers.push_back(n);

您还可以在单​​个 push_back 操作中插入整个数组:

KennyRogers.luckyNumbers.push_back(nums);

还有 push_frontinsert 方法,以防您需要将元素放在数组的前面或任意位置。

我认为我无法帮助确定何时持有或何时弃牌。

解决这个问题的一种方法是在 Gambler 的初始值设定项中建立 luckyNumbers,从一开始就使事情的大小正确并避免 resizing/rewriting 数组。为了在不调整大小的情况下执行此操作,您需要声明数组的域并将其也设置在初始化程序中:

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);