如何检查Chapel中是否设置了字段?

时间:2018-05-04 21:02:52

标签: chapel

我想看看是否在类

中设置了整数字段
class BounceHouse {
  var age: int;
}

var v = new BounceHouse();
if v.age != nil {
    writeln("not nil");
}

v.age = 17;

但是我在编译时遇到错误。查看age是否已设置的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

常见的答案是使用年龄的哨兵值,例如-1。然后,如果你检查它的值是-1,你就知道它没有被设置(除非有人恶意地将它设置为-1)。

您可以使用syncsingle变量,这将为您提供empty / full状态进行检查,但这可能会增加一点性能损失并且可能不是您想要的确切功能(因为有方法可以重置sync的值,也许您不关心它的并行安全性。)

第三个选项是添加一个额外的布尔字段,跟踪它是否已设置,并在给定值时覆盖要跟踪的字段的setter。

class BounceHouse {
  var age: int;
  var ageIsSet = false;

  // setter override
  inline proc age ref {
    ageIsSet = true;
    return age;
  }

  // getter override, so we don't accidentally think
  // age was set when someone was just looking at it
  inline proc age const ref {
    return age;
  }
}

var v = new BounceHouse();
writeln(v.age);
if v.ageIsSet {
    writeln("set");
}

v.age = 17;

if v.ageIsSet {
  writeln("set here too");
}

请注意,如果您将年龄分配给ref变量,或者将其作为参数发送到具有ref意图的函数,也可以欺骗第三个选项 - 它会认为您正在设置年龄但它的价值将保持不变。当然,由于Chapel不支持私有字段(有),有人可能会恶意设置ageIsSet