【问题标题】:What type has a variable containing a range to be?什么类型的变量包含一个范围?
【发布时间】:2013-01-21 15:41:54
【问题描述】:

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

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* 是哪种类型?

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

【问题讨论】:

    标签: variables types programming-languages range ada


    【解决方案1】:

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

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

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

    for Elem of Container loop
       ...
    end loop;
    

    【讨论】:

    • 变量不是数组。但我可以使用一个虚拟数组作为范围,对吧?
    • 嗯,你可以,但是为了这个目的而使用一个伪造的数组是非常不鼓励的。我编辑了答案,添加了一个简短示例,说明如果变量是离散类型,如何使用 First 和 Last 属性执行此操作。
    • @Marc, 'First & 'Last 不能应用于简单变量 - 只能应用于 arrays & (sub)types
    【解决方案2】:

    使用range 类型,大致如下:

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

    请参阅here 中的完整示例。

    【讨论】:

    • 但是如果我想使用范围作为子程序的参数,我必须使用泛型,对吗?所以我认为这个解决方案比使用两个变量更复杂......
    • 范围和其他类型一样,你要么沿着范围传递,要么沿着两个点传递并在需要的地方构建范围
    【解决方案3】:

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

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

    【讨论】:

    • Andrei Alexandrescu 的概念听起来很有趣!
    【解决方案4】:

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

    type Range_Type is range TheRange.Start .. TheRange.end;
    

    【讨论】:

    • 这肯定比创建泛型更麻烦!
    • @Simon:+1 并且是真的。我想我下意识地陷入了泛型限制更多的 VHDL。该记录至少可以移植到 VHDL...
    【解决方案5】:

    我的计数表明创建通用子程序比普通子程序需要多 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;
    

    看起来还不错。

    但是,通常迭代是对 something(数组,...)进行迭代:如果是这样,您可以从被迭代的事物中推导出迭代范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      相关资源
      最近更新 更多