将数组指定给Chapel类

时间:2017-10-20 15:11:07

标签: list-comprehension chapel

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

2 个答案:

答案 0 :(得分:4)

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

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

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

KennyRogers.luckyNumbers.push_back(nums);

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

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

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