5

可以在Ada中使用具有起点和终点的范围来完成for 循环:

for I in 0..10 loop
(...)
end loop;

我知道,可以使用描述范围的两个变量来执行for 循环:

for I in range_start..range_end loop
(...)
end loop;

是否也可以将范围存储在一个变量中?例如:

for I in my_range loop
(...)
end loop;

变量 *my_range* 是哪种类型?

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

4

5 回答 5

3

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

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

如果您对迭代容器的元素感兴趣,例如数组、向量、映射等,并且不关心索引,您可以使用广义循环(仅限 Ada 2012):

for Elem of Container loop
   ...
end loop;
于 2013-01-21T16:01:16.363 回答
2

Use a range type, something along these lines:

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

See the complete example in here.

于 2013-01-21T15:52:17.340 回答
1

我的计数说创建通用子程序比普通子程序需要多 4 行:

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;

这似乎还不错。

但是,通常迭代是在迭代某些东西(数组,...):如果是这样,您可以从被迭代的东西中得出迭代范围。

于 2013-01-23T17:18:20.717 回答
1

嗯。看起来您可能(也许在不知不觉中)是Andrei Alexandrescu的忠实拥护者。他强烈主张语言使范围成为一流的类型,并删除“迭代器”作为编程范式。

看看 Ada 的实现会是什么样子会很有趣。除非我遗漏了什么,否则 Ada 2012 不会这样。

于 2013-01-22T20:57:27.960 回答
1

如果要传递包含范围的对象,可以将 Start 和 End 包装在记录中。在子程序中,您可以在本地声明一个新的 [sub]type 以范围为界。

type Range_Type is range TheRange.Start .. TheRange.end;
于 2013-01-22T21:28:14.003 回答