通過抽象提供對變量的只讀訪問權限(當然可以)。例如,我可以使變量爲的模式參數的可調用實體或通用。變量的使用(通過這些常量視圖)將被限制在可調用或泛型實例中。如何使變量只讀,但不是常量?
這個結構不容易添加到現有的程序,我想,因爲程序已經結構化;此外,它不是一個獨立的解決方案,因爲它需要「只讀」和結構之間的耦合。
另一種選擇是使變量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