如何通过一次更改将记录x分配给记录y?

时间:2018-08-04 01:09:51

标签: ada

采用以下示例:

   type MyArray is array(1..10) of Float;
   type MyRecord is record
      a: Float;
      b: Integer;
      c: Boolean;
      d: MyArray;
   end record;
   …
   function foo(x: MyRecord) return MyRecord is
     y: MyRecord := x;
   begin
     y.b = -1;
     return y.b;
   end foo;

如果我可以用foo做这样的事情,那就太好了:

   function foo(x: MyRecord) return MyRecord is
     (x with (b => -1));

在更简单的表示法(无效的Ada)中,我可以将foo编写为表达式函数。有没有办法在Ada中做类似的事情?

1 个答案:

答案 0 :(得分:8)

好吧,Ada202x正在开发Delta Aggregates,这实际上是您想要的。在那之前,我唯一想到的两个选择是:

平原旧骨料:

function foo1(x : MyRecord) return MyRecord is
    (a => x.a, b => -1, c => x.c, d => x.d);

扩展退货:

function foo2(x : MyRecord) return MyRecord is
begin
    return Result : MyRecord := x do
        Result.b := -1;
    end return;
end foo2;

我知道扩展返回并不能为您提供所需的表达式函数,但这是一种更好的语法,可以通过有趣的方式与有限的类型一起使用。现在,您将不得不依靠简单的旧聚合语法。