Dafny中可以存在静态变量吗?

时间:2019-03-04 09:51:18

标签: dafny

在验证上下文中,我们通常将值传递给函数,以便将它们作为“单元”与周围上下文隔离。但是,从编程的角度来看,静态字段也有其用途。

由于Dafny可以编译到.NET平台,因此可以期望采用某种方式公开静态变量。

例如,对于实现Singleton模式,我期望类似:

class A { constructor () {}
  static var instance: A? := null;
  static method getInstance() returns (r: A)
    ensures A.instance() != null
  {
    if A.instance == null { var i := new A(); A.instance := i; }
    r := A.instance;
  }
}

但是,这会导致错误Fields cannot be declared 'static'.

有什么表达方式(不使用未解释的函数,因为这可能仅用于验证目的,但不会生成有用的代码)。

1 个答案:

答案 0 :(得分:1)

您今天不能在Dafny中对对象执行此操作。您需要将单例对象作为参数传递。

如果不需要对象,而是可以使用不可变的值进行访问,则可以使用const(在类或特性中使用static const,也可以在模块级别使用const

这个问题有时会出现,特别是在标准输入和输出的情况下。我为这种单例对象(类似于Scala中的resource或类似于Eiffel中的object)设计了once设计的草图,但是它从未达到最高优先级。欢迎您尝试以其他方式说服我(或自行提出并提供这样的功能)。

Rustan