我在这里谈论的是 Ada 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
,但我想在标准容器上构建一个抽象层,这样我以后就可以在不更改包客户中的任何代码的情况下更改底层容器。
获取和设置变量很容易 - 如上所述。真正的问题是迭代。我想让我的包的客户迭代环境并轻松获取每个元素的键和值。
当我使用 Ada 2012 时,最好的方法是使用迭代器,但是如何?我可以将光标返回到底层容器,但同样,此光标的界面将依赖于容器。
在标准容器迭代上实现这种抽象的最佳方法是什么?