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

How do I check if a field has been set in Chapel?

我想看看是否在 class

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

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

v.age = 17;

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

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

您可以使用 syncsingle 变量,这会给您一个 empty/full 状态来检查,尽管这可能会增加一点性能损失并且可能不是您想要的确切功能(因为有一些方法可以重置 syncs 的值并且您可能不关心它的并行安全性)。

第三个选项是添加一个额外的布尔字段跟踪它是否已被设置,并为您正在跟踪的字段覆盖 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 意图的函数,则第三个选项也可能被欺骗 - 它会认为您是将 age 设置为某物,但其值将保持不变。当然,由于 Chapel 不支持私有字段(目前),有人可能会恶意设置 ageIsSet