什么类型的变量包含范围?

时间:2013-01-21 15:41:54

标签: variables types programming-languages range ada

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 *是?

编辑: 假设我想将此变量用作子程序中的参数:因此子程序具有此循环,该循环遍历该范围。 我宁愿使用两个描述范围的变量而不是使用泛型,因为泛型会导致更高的努力。但我认为使用一个描述范围的变量会导致更高的可读性,这就是我问这个问题的原因。

5 个答案:

答案 0 :(得分:3)

如果您的变量是一个数组,那么您可以通过以下方式遍历其范围:

for I in Arr_Var'Range loop
   ...
end loop;

如果您有兴趣迭代容器的元素,例如数组,矢量,地图等,并且不关心索引,可以使用generalized looping(仅限Ada 2012):

for Elem of Container loop
   ...
end loop;

答案 1 :(得分:2)

使用range类型,类似于以下内容:

type Range_Type is range -5 .. 10;
...
for A in Range_Type loop

请参阅here中的完整示例。

答案 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;

看起来并不那么糟糕。

但是,通常迭代迭代某事(数组,......):如果是这样,你可以从正在迭代的东西中导出迭代范围。