【问题标题】:Ada : operator is not directly visibleAda : 运算符不直接可见
【发布时间】:2014-08-31 11:26:07
【问题描述】:

我正在使用 GNAT GPS Studio IDE 以便在 Ada 中进行一些训练。我遇到了包裹可见性问题。

首先我在一个名为“DScale.ads”的文件中指定一个包,其中包含一个类型:

package DScale is 
   type DMajor is (D, E, F_Sharp, G, A, B, C_Sharp);
end DScale;

然后我在不同的文件(“Noteworthy.ads”)中指定一个包,该包定义了一个将使用 DScale 包的 DMajor 类型的过程:

with Ada.Text_IO;
with DScale;

package NoteWorthy is 
   procedure Note;
end NoteWorthy;

最后在“Noteworthy.adb”中,我提供了包“Noteworthy”的包体:

with Ada.Text_IO; use Ada.Text_IO;

package body Noteworthy is
   procedure Note is 
      package ScaleIO is new Enumeration_IO(DScale.DMajor);
      thisNote : DScale.DMajor := DScale.D;   
   begin
      ScaleIO.Get(thisNote);

      if thisNote = DScale.DMajor'First then 
         Put_Line("First note of scale.");
      end if;
   end Note;
begin
   null;   
end NoteWorthy;

如果我按原样保留代码,我将在“Noteworthy”包的主体中收到“if thisNote = DScale.DMajor'First then”语句的“运算符不直接可见”错误。

有没有办法在不使用“use”或“use type”子句的情况下绕过这个错误?

谢谢。

【问题讨论】:

    标签: packages operator-keyword ada visible


    【解决方案1】:

    您的问题有(至少)两个答案。

    1:

    if DScale."=" (thisNote, DScale.DMajor'First) then
    

    2:

    function "=" (Left, Right : DScale.DMajor) return Boolean renames DScale.DMajor;
    ...
    if thisNote = DScale.DMajor'First then
    

    但是你为什么要使用这些选项之一而不是:

    use type DScale.DMajor;
    ...
    if thisNote = DScale.DMajor'First then
    

    【讨论】:

    • 使用 Ada 2012,你可以说 use all type DScale.DMajor; 然后 if thisNote = D then .. 但这只会给你文字,所以你仍然需要限定 DScale.DMajor’First
    【解决方案2】:

    Ada 类型不仅仅是对值的描述,它们是产生大量操作的实体,体现为运算符和属性。因此,如果您想直接查看类型的具体“=”运算符,则必须使其可见。为此,您需要“使用”或“使用类型”。

    为什么要绕过语言功能?只需明智地使用它。

    【讨论】:

    • 原因是除了枚举式的数据表示之外,还要学习 Ada 类型特征的完整扩展。感谢您的回复:)
    【解决方案3】:

    与您的代码结构相关的几点。

    Noteworthy 的包规范不需要“使用 DScale”,因为规范中没有任何内容涉及该包中的任何功能(也许您计划在未来)。

    如果您只想对要由计算机读取的文件进行 I/O,则使用 enumeration_io 是很好的选择,但我永远不会将它用于人机交互(除了快速破解)。它接受的输入值由 Ada 的语法决定,通常不是用户所期望的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2014-10-24
      相关资源
      最近更新 更多