如何通过一次更改将记录 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 无法为您提供所需的表达式函数,但它是一种更好的语法,可以以有趣的方式与有限类型一起使用。现在您将不得不依赖普通的旧聚合语法。
举个例子:
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 无法为您提供所需的表达式函数,但它是一种更好的语法,可以以有趣的方式与有限类型一起使用。现在您将不得不依赖普通的旧聚合语法。