3

这是我需要在 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。也就是说,我必须稍后分配它们。此外,我需要知道何时握住它们,知道何时折叠它们。

4

2 回答 2

4

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

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

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

KennyRogers.luckyNumbers.push_back(nums);

如果您需要将元素放在数组的前面或任意位置,还有一些push_front方法。insert

我不认为我可以帮助何时握住它们或何时折叠它们。

于 2017-10-20T15:27:08.967 回答
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);
于 2017-10-20T16:10:11.563 回答