dafny - Dafny 中可以存在静态变量吗?
问题描述
在验证上下文中,我们通常将值传递给函数,以便将它们作为“单元”与周围的上下文隔离开来。但是,从编程的角度来看,静态字段也有其用途。
由于 Dafny 编译到 .NET 平台,因此有理由期待某种方式来公开静态变量。
例如,为了实现单例模式,我期望类似:
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'.
有什么方法可以表达这一点(不使用未解释的函数,因为这可能仅用于验证目的,但不会生成有用的代码)。
解决方案
你今天不能在 Dafny 中为对象执行此操作。您需要将单例对象作为参数传递。
如果您不需要对象而是可以使用不可变值来解决问题,那么您可以使用 a const
(static const
类或特征内部的 a ,或模块级别的const
)。
这个问题不时出现,尤其是在标准输入和输出的上下文中。我有resource
这样一个单例对象的设计草图(有点像object
在 Scala 中或类似于once
在 Eiffel 中),但它从未达到最高优先级。欢迎您尝试以其他方式说服我(或自己提出并提供此类功能)。
鲁斯坦
推荐阅读
- spring-boot - Spring Boot 2.0.0 的 Consul 问题
- android - 使用网络摄像头在模拟器(android studio)上运行 ARCore 项目
- python - 在python中调用r脚本?
- javascript - 在 angular/typescript 中触发 bootstrap js collpase() 函数
- vue.js - 不工作...mapGetters
- wordpress - Wordpress 三级菜单自定义 Walker
- angular - 离子形式组补丁值补丁作为字符串数组中的字符串
- angular - 在 Angular2 打字稿类中找不到模块
- javascript - 如何使用 Jest 模拟原生 javascript 方法?
- c++ - C++ 递归函数中的分段错误