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