gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:50:52 25 4
gpt4 key购买 nike

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;

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

最佳答案

通过引入一个非重载的实用函数来进行访问类型比较,OP 的函数定义以及所需的语法修复和修改以使用实用函数,可以工作。

不过,我仍然很困惑,为什么调用“=”作为标准。“= 被编译器(GNAT)拒绝,因为它指定了“不兼容的参数”。

with Text_IO; use Text_IO;

procedure non_recursive_equals is

type Lstring is access String;

-- Be aware, the ordering of the functions here is important!
function Is_Equal(Lstring1, Lstring2 : in Lstring) return Boolean is
begin
return Lstring1 = Lstring2;
end Is_Equal;

function "=" (lString1, lString2 : in Lstring) return Boolean is
begin
if Is_Equal(LString1, null) and Is_Equal(LString2, null) then
return True;
elsif Is_Equal(LString1, null) or Is_Equal(LString2, null) then
return False;
end if;
return False;
end "=";

L1, L2 : Lstring := null;

begin
Put_Line("L1 and L2 null: " & Boolean'Image(L1 = L2));
L2 := new String(1..10);
Put_Line("L2 not null : " & Boolean'Image(L1 = L2));
end non_recursive_equals;

编辑:

这是另一种方式,使用重命名子句:
with Text_IO; use Text_IO;

procedure non_recursive_equals is

type Lstring is access String;

function Is_Equal (lString1, lString2 : in Lstring) return Boolean is
begin
if lString1 = null and lString2 = null then
return True;
elsif lString1 = null or lString2 = null then
return False;
end if;
return False;
end Is_Equal;

function "=" (Lstring1, Lstring2 : in Lstring) return Boolean renames
Is_Equal;

L1, L2 : Lstring := null;

begin
Put_Line ("L1 and L2 null: " & Boolean'Image (L1 = L2));
L2 := new String (1 .. 10);
Put_Line ("L2 not null : " & Boolean'Image (L1 = L2));
end non_recursive_equals;

关于overloading - 如何在不创建递归函数的情况下重载 Ada 中的 '=' 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6086358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com