我正在学习Ada,因为我对严格的类型安全和编程合同的想法很感兴趣。 “永远编程”的想法很不错。无论如何,真正的问题是Ada是否具有可变函数。搜索Ada没有的SO suggests,并且正确的方法是使用无约束的数组,其长度在运行时确定。
我的问题是,你不是怎么做的,而是正确做法的惯例是什么?
另外,为什么Ada可以执行(看起来像基于堆栈的)操作,比如+(例如1 + 2 + 3),但它不能对函数调用的参数执行相同的操作?
完全没有像variadic表达式那样更加惯用
Max(1, 2, 3, ..., n)
,或者仅仅是您应该像Args.len=n; Max(Args[])
一样将参数传递给它?
我的本能和我从阅读各种Ada书籍中所获得的内容表明,由于它们不那么安全,你不应该有非特定的功能。
答案 0 :(得分:3)
根据建议here,“可变函数可能会暴露某些语言中的类型安全问题。”虽然Ada不支持可变参数函数,但看到here的示例使用operator overloading中的array aggregate来模仿行为。可变参数列表带来的风险通常在于允许原始输入数据直接传递给可执行代码。插入的聚合在Ada中排除了这一点,同时允许风格方便。
在下面的片段中,重载的+
函数会将每个字符串文字转换为Unbounded_String
,每个Unbounded_String
成为Variadic_Array
的一个组成部分,然后成为Print_Line
的一部分Constraint_Error
函数的唯一参数。如果prescribed checks中的任何一个失败,则会引发Print_Line((+"Mary", +"had", +"a", +"little", +"lamb."));
。
Superhero winner2 = Cyclops.fight(Colossus);
System.out.println("Testing the Cyclops strength: " + Cyclops.getStrength());
System.out.println("The winner is: " + winner.getName());