Ada 试图使函数通用,但挂断了

Ada 试图使函数通用,但挂断了,ada,Ada,这是我的问题。我在包中有一个变量(本例中为rec),当从包3调用时需要设置该变量,但它是私有的。以前,函数“set_true”只将rec设置为true,所以这没什么大不了的。但是我有另一个包做同样的处理(我给出了一个简单的例子,但是我的文本情况更复杂),所以我想,我可以传入我想要修改的变量,然后让它被修改。在下面的布局中设置“rec”的唯一方法是在包1中创建第二个函数,该函数使用rec作为参数调用set_true吗?我希望避免不断创建额外的函数来处理局部变量。我不能将变量移动到public(sp

这是我的问题。我在包中有一个变量(本例中为rec),当从包3调用时需要设置该变量,但它是私有的。以前,函数“set_true”只将rec设置为true,所以这没什么大不了的。但是我有另一个包做同样的处理(我给出了一个简单的例子,但是我的文本情况更复杂),所以我想,我可以传入我想要修改的变量,然后让它被修改。在下面的布局中设置“rec”的唯一方法是在包1中创建第二个函数,该函数使用rec作为参数调用set_true吗?我希望避免不断创建额外的函数来处理局部变量。我不能将变量移动到public(spec),因为我正试图遵循约定,并且这个“类型”的变量在其他任何地方都不是公共的,我不希望任何人能够自己设置它(我希望函数必须设置)。我不想创建第二个名为“set_local_true”的函数,并且创建一个重载函数set_true,没有参数,调用set_true(value=>rec)似乎是骗人的,有人对我的限制有更好的建议吗

我的两个要求:
1.无法将局部变量公开。
2.能够使用该函数对外部和内部进行计算

package one is
 procedure set_true(value : out Boolean);
end one;

package body one is
   rec : Boolean;
begin
 procedure set_true(value : out Boolean)
 begin
  value := true;
 end set_true;
end one;

package body two is
 local_rec : Boolean;
begin
  procedure call_function is
   begin
     one.set_true(value => local_rec);
  end call_function;
end two;

package body three is
begin
  procedure call_function is
  begin
    one.set_true(value => <PACKAGE ONE'S REC))
  end call_function;
end three;
第一包是
过程设置为真(值:out Boolean);
结束一;
包体一是
rec:布尔型;
开始
过程集_true(值:out Boolean)
开始
值:=真;
结束设置为真;
结束一;
包体二是
本地记录:布尔值;
开始
过程调用函数为
开始
一、设置为真(值=>local\u rec);
结束调用函数;
结束二,;
包体三是
开始
过程调用函数为
开始

1.把你的想法变为现实(value=>首先,这是一个非常愚蠢的代码。我假设它是其他东西的简写。但是,正如前面介绍的,我可以向您保证,您的客户可以自己设置布尔值,而无需您为他们编写例程。事实上,他们可以做得更好。对于这个答案的其余部分,我假设您没有真正编写variables为人们设置布尔值,但是做一些实际使用的事情。如果没有,忽略这个答案的其余部分,只是删除你愚蠢的例程

其次,如果你正在创建一个带有单个参数的例程,那么除非对象非常大,否则你可能应该将其改为函数。如果你的客户愿意,这将允许他们使用函数编程。按照你的方式,可怜的程序员不得不停下来创建一个特殊的变量来调用你的例程e即使他们只想做一次

第三,我通常更喜欢在请求状态下传递,而不是为每个状态使用唯一的set例程

function Set_Frobnost (New_State : boolean := true) return boolean;
如果状态真的是布尔型的(将来不可能有第三种状态),那么这是可以讨论的。但是,如果客户可能已经必须将状态存储在变量中(或循环),这对客户来说是一个很大的优势

你对命名的编辑告诉我你走对了方向

你应该在这里做两件事中的一件

  • 找到由该变量控制的更高级别的概念,然后命名为“setter”例程
  • 滚开,把flag变量放到pacakge规范中

  • 如果必须访问私有变量,可以在子包中访问

    package One is
       procedure Foo (X : Boolean);
    private
       One_Private : Boolean;
    end One;
    
    然后

    package body One.Two is
        procedure Bar is
           One.Foo (One.One_Private);
        end Bar;
    end One.Two;
    

    包的“私有”部分中的元素类似于C++/Java中的“受保护”实体。真正的私有变量(仅在包体中)无法从任何其他地方访问。

    我试图给出一个简单的示例,我无法发布文字代码,但我发布了一个类似的版本,在一个示例中,我实际上传递了大约8个变量(我知道我知道,8个变量……),但这是这种情况所必需的。基本上,会出现一个case语句,其中两个变量被设置为特定值,而其他变量则不会被触及。不过,我喜欢你的建议!如果大多数参数都有逻辑默认值,请将它们与默认值一起放在参数列表的末尾。如果没有,则创建自己的类(包w/抽象数据类型)中的一部分。许多参数表明,meerly设置对例程的调用本身就是一项杂务。软件应该为我们做杂务。:-@T.E.D不幸的是,当我尝试编译“out”时参数不能是默认的,所有参数都是外部参数,你能举一个简单的例子说明你所说的抽象数据类型的包是什么意思吗?我的意思是我考虑过把它们放入一个数组,然后只传递一个数组,这个想法和你的想法有很大区别吗?还有“默认值”通常在调用包中处理,并且在传递到过程之前已经默认。不,您不能默认参数。我在那里使用的技巧是重载。使用相同的接口创建例程,但不使用您不关心的参数…至于ADT,请查看您用于学习的Ada书籍。基本idea是把你所有的“参数”放在一个记录中,然后把它放在一个包中,包中有一些处理它的例程(可能包括你的这些“设置”例程)。如果要使用继承,可以对记录进行标记,但这不是nessecary。这样调用例程可能只需要一行或两行代码,而不是17行左右的代码。您倾向于查看是否所有内容都必须单独声明和初始化。