Chapel 我如何检查礼拜堂中是否设置了场地?

Chapel 我如何检查礼拜堂中是否设置了场地?,chapel,Chapel,我想看看类中是否设置了整数字段 class BounceHouse { var age: int; } var v = new BounceHouse(); if v.age != nil { writeln("not nil"); } v.age = 17; 但我在编译时遇到了一个错误。查看是否设置了年龄的正确方法是什么?常见的答案是对年龄使用哨兵值,如-1。然后,如果您检查它的值并且它是-1,您就知道它没有被设置(除非有人恶意地将它设置为-1) 您可以使用sync或sing

我想看看类中是否设置了整数字段

class BounceHouse {
  var age: int;
}

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

v.age = 17;

但我在编译时遇到了一个错误。查看是否设置了
年龄
的正确方法是什么?

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

您可以使用
sync
single
变量,这将为您提供一个要检查的
/
状态,尽管这可能会增加一点性能损失,并且可能不是您想要的确切功能(因为有很多方法可以重置
sync
s的值,而且您可能不关心它的并行安全性)

第三个选项是添加一个额外的布尔字段跟踪是否已设置,并覆盖正在跟踪的字段的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