如何检查是否已在 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
)。
您可以使用 sync
或 single
变量,这会给您一个 empty
/full
状态来检查,尽管这可能会增加一点性能损失并且可能不是您想要的确切功能(因为有一些方法可以重置 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
意图的函数,则第三个选项也可能被欺骗 - 它会认为您是将 age 设置为某物,但其值将保持不变。当然,由于 Chapel 不支持私有字段(目前),有人可能会恶意设置 ageIsSet
。
我想看看是否在 class
中设置了整数字段class BounceHouse {
var age: int;
}
var v = new BounceHouse();
if v.age != nil {
writeln("not nil");
}
v.age = 17;
但是我在编译时出错。查看age
是否已设置的正确方法是什么?
常见的答案是使用年龄标记值,例如 -1
。然后如果你检查它的值是-1
,你就知道它没有被设置(除非有人恶意将它设置为-1
)。
您可以使用 sync
或 single
变量,这会给您一个 empty
/full
状态来检查,尽管这可能会增加一点性能损失并且可能不是您想要的确切功能(因为有一些方法可以重置 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
意图的函数,则第三个选项也可能被欺骗 - 它会认为您是将 age 设置为某物,但其值将保持不变。当然,由于 Chapel 不支持私有字段(目前),有人可能会恶意设置 ageIsSet
。