我刚刚开始使用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包也很困难.标准库设计者是否真的考虑过荒谬且过长的包层次结构?
感谢您阅读本文,并可能帮助我.我是阿达的新手.
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
开关来强制执行Ada 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)
这很短!