我说的是2012阿达这里。
我将让代码首先发言:
with Ada.Containers.Hashed_Maps;
with Ada.Strings.Unbounded;
with Ada.Strings.Unbounded.Hash_Case_Insensitive;
with Ada.Strings.Unbounded.Equal_Case_Insensitive;
package Environments is
type Environment is tagged private;
function Variable (
E : in Environment;
Name : in Ada.Strings.Unbounded.Unbounded_String
)
return Ada.Strings.Unbounded.Unbounded_String
with Inline;
procedure Set_Variable (
E : in out Environment;
Name : in Ada.Strings.Unbounded.Unbounded_String;
Value : in Ada.Strings.Unbounded.Unbounded_String
)
with Inline;
private
package Variable_Maps is new Ada.Containers.Hashed_Maps (
Key_Type => Ada.Strings.Unbounded.Unbounded_String,
Element_Type => Ada.Strings.Unbounded.Unbounded_String,
Hash => Ada.Strings.Unbounded.Hash_Case_Insensitive,
Equivalent_Keys => Ada.Strings.Unbounded.Equal_Case_Insensitive,
"=" => Ada.Strings.Unbounded."="
);
type Environment is tagged record
Variables : Variable_Maps.Map;
end record;
end Environments;
我们这里有一个例子包相当好说明我的问题。 我存储一些环境变量在Hashed_Map
,但我想建立在标准的容器中的抽象层,这样我就可以在将来改变垫层容器,但未在我的包的客户更改任何代码。
获取和设置变量很容易 - 如上声明。 真正的问题是迭代。 我想,让我的包的客户来遍历环境,让key和值轻易每个元素。
由于我使用的Ada 2012的最佳方法是使用迭代器,但如何? 我可以返回游标的垫层容器,但同样,这光标的界面将容器依赖。
什么是实现对标准集装箱迭代这种抽象的最好方法?