我想看看是否在类
中设置了整数字段class BounceHouse {
var age: int;
}
var v = new BounceHouse();
if v.age != nil {
writeln("not nil");
}
v.age = 17;
但是我在编译时遇到错误。查看age
是否已设置的正确方法是什么?
答案 0 :(得分:3)
常见的答案是使用年龄的哨兵值,例如-1
。然后,如果你检查它的值是-1
,你就知道它没有被设置(除非有人恶意地将它设置为-1
)。
您可以使用sync
或single
变量,这将为您提供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
。