代码之家  ›  专栏  ›  技术社区  ›  Brian Dolan

如何检查小教堂中是否设置了场地?

  •  2
  • Brian Dolan  · 技术社区  · 8 年前

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

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

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

    1 回复  |  直到 8 年前
        1
  •  3
  •   Lydia Duncan    8 年前

    常见的答案是对年龄使用哨兵值,如 -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 恶意的。