1

我正在尝试在 Chapel 中编写一个带有条件的迭代器。这有效

var x = [1,4,5,2,6,3];

iter dx(x) {
  for y in x do yield 2*y;
}

for y in dx(x) {
  writeln("y -> ", y);
}

返回

y -> 2
y -> 8
y -> 10
y -> 4
y -> 12
y -> 6

假设我只想返回大于 3 的那些。这些都不会编译。什么是正确的语法?

变量 x = [1,4,5,2,6,3];

iter dx(x) {
  //for y in x do {if x > 3} yield 2*y;  // Barf
  //for y in x do {if x > 3 yield 2*y }; // Barf
  //for y in x do if x > 3 yield 2*y ;   // Barf
}

for y in dx(x) {
  writeln("y -> ", y);
}
4

1 回答 1

2

错误是您正在检查迭代器参数x而不是条件中的当前元素y。尝试:

iter dx(x) {
  for y in x {
    if y > 3 {
      yield 2*y; 
    }
  }
}

或更简洁的形式:

iter dx(x) {
  for y in x do if y > 3 then yield 2*y; 
}

请注意,当语句的主体if是单个语句时,您可以使用then关键字来引入主体,而不是将其括在大括号中{ }。与 C 不同,then关键字是必需的(由于否则会出现语法歧义)。

于 2017-12-14T22:54:17.360 回答