代码之家  ›  专栏  ›  技术社区  ›  Ben Hocking

如何将记录x分配给记录y,只需一次更改?

ada
  •  1
  • Ben Hocking  · 技术社区  · 6 年前

    举个例子:

       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)允许我编写 作为表达式函数。艾达有没有办法做这种事?

    1 回复  |  直到 6 年前
        1
  •  8
  •   Jere    6 年前

    嗯,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;
    

    我知道扩展返回并不能得到您想要的表达式函数,但它是一种更好的语法,可以用有趣的方式与有限的类型一起使用。现在,您将不得不依赖简单的旧聚合语法。