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 定义的运算符。有没有办法将它与我的重载运算符区分开来?
我不确定为什么“=”被递归使用;可能存在一个不幸的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)