首页 文章

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

提问于
浏览
5

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

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

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

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

是否也可以将范围存储在 one 变量?中,如:

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

哪个类型的变量* my_range *是?

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

5 回答

  • 1

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

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

    如果您关心索引,可以使用generalized looping(仅限Ada 2012):

    for Elem of Container loop
       ...
    end loop;
    
  • 1

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

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

    请参阅here中的完整示例 .

  • 2

    嗯 . 看起来你可能(也许是在不知不觉中)是Andrei Alexandrescu的奉献者 . 他强烈主张语言使范围成为一流类型,并将"iterators"作为一种编程范式去除 .

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

  • 3

    如果要传递包含范围的对象,可以将Start和End包装在记录中 . 在子程序中,您可以在本地声明由范围限定的新[sub]类型 .

    type Range_Type is range TheRange.Start .. TheRange.end;
    
  • 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;
    

    这似乎并不那么糟糕 .

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

相关问题