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

How can I assign record x to record y with a single change?

举个例子:

   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 中做这样的事情?

嗯,Ada202x 正在研究 Delta Aggregates,这正是您想要的。在那之前,我唯一能想到的 2 个选项是:

普通旧聚合:

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

扩展Return:

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

我知道扩展 return 无法为您提供所需的表达式函数,但它是一种更好的语法,可以以有趣的方式与有限类型一起使用。现在您将不得不依赖普通的旧聚合语法。