Silly Ada通用包裹管理?

Arj*_*jun 0 ada

我刚刚开始使用Ada,我发现通用包声明相当愚蠢.也许我做得不对,所以我正在寻找更好的选择.

看看下面的例子.

package STD_Code_Maps is new
   Ada.Containers.Map(Key_Type     => STD_Code_Type;
                      Element_Type => Ada.Strings.Unbounded.Unbounded_String);
STD_Code_Map : STD_Code_Maps.Map;

-- . . .

procedure Do_Something is
   Item : Ada.Strings.Unbounded.Unbounded_String;
begin
   Item := STD_Code_Maps.Element(STD_Code_Maps.First(STD_Code_Map));
   -- Do something with the Item
   -- . . .
end Do_Something;
Run Code Online (Sandbox Code Playgroud)

简单地写STD_Code_Map.First.Element一下而不是写下来就更清晰了STD_Code_Maps.Element(STD_Code_Maps.First(STD_Code_Map));

显然我做错了 - 我想.我在那里至少重复三次STD_Code_Map这个短语.我只是为了冗长和一切,但实际上我写的代码对我来说似乎很糟糕和愚蠢.

我想知道是否有解决方案不要求你将包重命名为类似于package Map renames STD_Code_Maps;缩短代码的东西,但我不想在每个过程条目上执行此操作.我真的认为类似的事情STD_Code_Map.First.Element要简单得多.这可以在Ada 2012中完成吗?

注意:默认情况下使用Unbounded_String包也很困难.标准库设计者是否真的考虑过荒谬且过长的包层次结构?

感谢您阅读本文,并可能帮助我.我是阿达的新手.

Sim*_*ght 5

GNAT GPL 2012和2013,以及FSF GCC 4.7和4.8,支持Ada 2012的新容器索引方案,这意味着您可以编写

Item := STD_Code_Map ({some Cursor});
Run Code Online (Sandbox Code Playgroud)

你甚至可以通过-gnat05开关来强制执行A​​da 2005模式!(这必须是一个错误).

Ada 2005允许您使用object.function符号来调用标记类型的基本函数,前提是第一个操作数是标记类型; 所以你可以写作STD_Code_Map.First速记STD_Code_Maps.First (STD_Code_Map).

把这些放在一起,你可以写

Item := STD_Code_Map (STD_Code_Map.First);
Run Code Online (Sandbox Code Playgroud)

这很短!