常见的答案是对年龄使用哨兵值,如
-1
如果你检查它的值
-1个
,您知道它尚未设置(除非有人恶意将其设置为
-1个
)。
你可以使用
sync
或
single
变量,它将为您提供
empty
/
full
要检查的状态,尽管这可能会增加一点性能损失,并且可能不是您想要的确切功能(因为有方法重置
同步
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
变量,或将其作为参数发送给具有
参考
意图——它会认为你在为某件事设定年龄,但它的价值不会改变。当然,由于Chapel还不支持私人场地,有人可以设置
ageIsSet
恶意的。