【问题标题】:Enforce value type semantics/immutability in Fortran?在 Fortran 中强制执行值类型语义/不变性?
【发布时间】:2020-03-10 08:49:57
【问题描述】:

查看我们的代码库,我看到很多情况,派生类型的字段使您期望它们在初始化后保持不变,理想情况下,一次全部初始化并且之后永远不会更改(如“值类型”)。

在实践中,已经建立了快速解决方案,因此字段是否更改甚至它包含的内容可能取决于代码路径,从而导致到处都有大量的 IF-ELSE 级联,使代码难以遵循并且易受更改影响。

这让我想知道:是否可以强制执行诸如字段不变性之类的约束?

【问题讨论】:

  • 没有“变量一旦设置一次就不能改变值”的概念(即使对于组件也是如此),但是封装方法(带有 getter 的私有组件)是否适合您的需求?
  • @francescalus 并非如此,因为字段通常是数组。返回数组的副本效率低下,返回指针需要能够将该指针标记为“指向不可变事物”,并且据我所知,无法通过访问器函数以某种方式访问​​数组允许切片语法。
  • 您需要对这些派生类型执行哪些操作?如果它们的数量相当少,您可以编写一个执行它们的例程库吗?
  • Protected 总是让我有点失望,我真的希望它应用于派生类型定义,这意味着该类型的所有变量只能由包含模块修改,而不仅仅是与使用相关的那种类型的变量——“全局”变量让我很紧张。而且我认为这将更接近 OP 想要的。
  • 真正的主要问题是沟通。如果我有 IMMUTABLE TYPE 之类的东西,那将清楚地与同事沟通,不要将可变字段添加到该类型(例如记录器状态信息),并为将来使用该类型读取代码的人提供明显的保证。

标签: fortran immutability


【解决方案1】:

您可以使用“参数”关键字将变量设为常量。

https://www.tutorialspoint.com/fortran/fortran_constants.htm

real, parameter :: g = 9.81

您必须在编译时知道这些值,所以这可能不是您想要的。如果不是,您能否给我们一些澄清,我们可以尝试帮助您?

************编辑******************

正如上面其他人所说,如果您需要能够在运行时设置变量,那么 getter 和 setter 是可行的方法。

您可以将变量设为私有并为其编写 getter 和 setter,或者如果您将变量设为 protected,则只需为其编写一个 setter。

【讨论】:

  • 很遗憾,它不适用于派生类型组件。
  • 您可以将整个派生类型实例设为常量。
  • 我认为 Anon 不需要,但他们可以自己告诉我们。
  • 不是我要找的;我对编译时常量非常了解(顺便说一句,它适用于派生类型,只要它们具有静态大小),但我正在寻找类似于 Javascript、C、C++ 中的“const”关键字的东西: value 是在运行时计算的,但静态保证它在分配后不会改变。
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2014-03-29
  • 2019-06-21
  • 2018-04-04
  • 2019-08-07
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多