for for loop 可以使用带有起点和终点的范围在 Ada 中完成:
for I in 0..10 loop
(...)
end loop;
我知道,可以使用描述范围的两个变量来执行 for loop :
for I in range_start..range_end loop
(...)
end loop;
是否也可以将范围存储在一个变量?中,例如:
for I in my_range loop
(...)
end loop;
哪个类型的变量* my_range *是?
编辑: 假设我想将此变量用作子程序中的参数:因此子程序具有此循环,该循环遍历该范围。 我宁愿使用两个描述范围的变量而不是使用泛型,因为泛型会导致更高的努力。但我认为使用一个描述范围的变量会导致更高的可读性,这就是我问这个问题的原因。
答案 0 :(得分:3)
如果您的变量是一个数组,那么您可以通过以下方式遍历其范围:
for I in Arr_Var'Range loop
...
end loop;
如果您有兴趣迭代容器的元素,例如数组,矢量,地图等,并且不关心索引,可以使用generalized looping(仅限Ada 2012):
for Elem of Container loop
...
end loop;
答案 1 :(得分:2)
答案 2 :(得分:1)
嗯。看起来你可能(可能是在不知不觉中)成为Andrei Alexandrescu的奉献者。他强烈主张语言使范围成为一流类型,并将“迭代器”作为一种编程范式去除。
看看这个Ada实现的样子会很有趣。除非我遗漏了什么,否则这不是Ada 2012的方式。
答案 3 :(得分:1)
如果要传递包含范围的对象,可以将Start和End包装在记录中。在子程序中,您可以在本地声明由范围限定的新[sub]类型。
type Range_Type is range TheRange.Start .. TheRange.end;
答案 4 :(得分:1)
我的计数表明你需要再创建一个通用子程序而不是普通的子程序:
generic -- extra
type Bounds is (<>); -- extra
procedure R;
procedure R is
begin
for J in Bounds'Range loop
null;
end loop;
end R;
with R;
procedure P is
type Rng is range 1 .. 10; -- extra
procedure A is new R (Rng); -- extra
begin
A;
end P;
看起来并不那么糟糕。
但是,通常迭代迭代某事(数组,......):如果是这样,你可以从正在迭代的东西中导出迭代范围。