通过抽象提供对变量的只读访问权限(当然可以)。例如,我可以使变量为的模式参数的可调用实体或通用。变量的使用(通过这些常量视图)将被限制在可调用或泛型实例中。如何使变量只读,但不是常量?
这个结构不容易添加到现有的程序,我想,因为程序已经结构化;此外,它不是一个独立的解决方案,因为它需要“只读”和结构之间的耦合。
另一种选择是使变量private并导出返回其值的函数。但是,我想要直接曝光,例如的一个易变的常数,仍然是从不同的角度来看变量。
我想出了一个覆盖:
with Interfaces;
package Read_Only is
subtype Pins is Interfaces.Unsigned_16;
V : constant Pins with Volatile, Import;
private
Backing : Pins with Volatile;
for V'Address use Backing'Address;
procedure Reset;
end Read_Only;
该屏蔽V
所以只有封装体(和孩子)可以修改它的价值,而包的客户端可以读取V
。但是,“隐藏”所有这些方面和地址的背后让我想:还有其他更明显的方式吗?
编辑:由@ flyx的评论提醒,包将看到constant
的公共部分的读者和很可能认为V
是物理常数,它不是,是volatile
。我更希望能够保留这两个类似于对象的字符V
以及它不能从Read_Only
以外改变的事实。 V
这里实际上并不是一个常量对象,但它的声明是这样说的。我想我想宣布对一个可识别的易变对象或某个对象的持续观点,而不会引发功能的突发事件。
难道编译器允许基于这样的事实,'V'是'constant',这将打破你的代码做一些优化,因为它不是实际上不变?我也会说一个函数是最好的方法,因为它告诉用户和编译器该值可能会随时间而改变。 – flyx
我不认为编译器可以优化,如果有的话(你有什么想法?),在** volatile **的存在 - 尽管它可能内联一个函数返回一个副本或引用(如果可能的话)一个易变的变量。但是,如何优化带走**常数**?我会说,这个编译器会被严重破坏。此外,** volatile **可以防止软件包成为“Pure”,而通常情况下,Ada函数在纯软件包中更是如此,它是实际上随时间变化的值的微弱指标,即使是没有参数的值也是如此。但这是问题或愿望的一部分:“常量”≠“只读”。 – B98
我同意'Volatile'将最有可能禁止不断传播。这只是一个想法,我没有记住LRM。不过,当我这样做时,我的GNAT发出*警告:常量覆盖变量*。 – flyx