如何在不创建递归函数的情况下重载 Ada 中的“=”运算符?

Gra*_*ong 5 overloading ada

FUNCTION "=" (lString1, lString2 : IN lString) RETURN boolean IS


     IF lString1 = NULL AND lString2 = NULL THEN 
        RETURN true;
      ELSIF lString1 = NULL OR lString2 = NULL THEN
        RETURN false;
      END IF;
Run Code Online (Sandbox Code Playgroud)

我正在尝试重载 Ada 中的相等运算符。每次我在函数中使用运算符 '=' 时,它都会导致导致堆栈溢出的递归,而不是使用我需要的 ada 定义的运算符。有没有办法将它与我的重载运算符区分开来?

tra*_*god 2

我不确定为什么“=”被递归使用;可能存在一个不幸的use条款。下面的示例重载"="并产生以下输出。重载函数隐式调用Standard."="进行比较。请注意,您可以指定renames简化包名称,并且可以use type仅公开适用于类型的运算符。

Standard."="附录:我在下面的评论中添加了另一种调用方式。

安慰:

******************
******************
真的
真的

代码:

with Ada.Strings.Bounded;
with Ada.Strings.Unbounded;
with Ada.Text_IO;

procedure UseType is
   package String20 is new Ada.Strings.Bounded.Generic_Bounded_Length(20);
   use type String20.Bounded_String;

   package StringN renames Ada.Strings.Unbounded;
   use type StringN.Unbounded_String;

   function "=" (Left  : String20.Bounded_String;
                 Right : StringN.Unbounded_String) return Boolean is
   begin
      return String20.To_String(Left) = StringN.To_String(Right);
      -- return Standard."="(String20.To_String(Left), StringN.To_String(Right));
   end "=";

   SB : constant String20.Bounded_String := 20 * '*';
   SN : constant StringN.Unbounded_String := 20 * '*';

begin
   Ada.Text_IO.Put_Line(String20.To_String(SB));
   Ada.Text_IO.Put_Line(StringN.To_String(SN));
   Ada.Text_IO.Put_Line(Boolean'Image(SB = SN)); -- infix operator
   Ada.Text_IO.Put_Line(Boolean'Image("="(SB, SN))); -- named operator
end UseType;
Run Code Online (Sandbox Code Playgroud)