gpt4 book ai didi

delphi - 记录属性的 DWScript setter

转载 作者:行者123 更新时间:2023-12-03 15:32:30 26 4
gpt4 key购买 nike

我的问题很简单。我有一个 dwsUnit,其中包含以下代码:

type
TPointCoord = record
X: Float;
Y: Float;
Z: Float;
end;

type
TMyClass = class
private
fPosition: TPointCoord;

function GetPosition: TPointCoord;
procedure SetPosition(Val: TPointCoord);
public
property Position: TPointCoord read GetPosition write SetPosition;
constructor Create;
end;

function TMyClass.GetPosition: TPointCoord;
begin
Result := fPosition;
end;

procedure TMyClass.SetPosition(Val: TPointCoord);
begin
fPosition := Val;
end;

constructor TMyClass.Create;
begin
inherited Create;
fPosition.X := 1;
fPosition.Y := 2;
fPosition.Z := 3;
end;

var
mc: TMyClass;
begin
mc := TMyClass.Create;
mc.Position.X := 2; //Syntax Error
end.

在 mc.Position.X (或 Position.Y 或 Z)我得到:

Syntax Error: Cannot assign a value to the left-side argument [line: 42, column: 17]

这是什么意思?如果记录是属性,那么它是只读的吗?以及我如何从 Delphi 端访问它。 (第二个问题,没什么大不了的)

最佳答案

出现此错误的原因是您使用的是记录类型的属性。

记录类型是一种值类型,这意味着它是在赋值时复制而不是引用(如类),因此返回记录的函数(或属性)将进行复制并返回不同的记录。

所以你的路线

mc.Position.X := 2

实际上相当于

temp := mc.getPosition;
temp.X := 2;

“temp”是与 fPosition 不同的变量/存储,因此代码不会更改 fPosition.X,它只会更改“隐藏”临时副本的 X 字段。

由于这通常不太可能是您想要的,因此 DWS 编译器就像 Delphi 一样,会抛出错误。

典型的解决方案是提供一个独特的 PositionX 属性,它将提供对 fPosition 的 X 字段的访问,例如

property PositionX : TPointCoord read (FPosition.X) write (FPosition.X);

或者,如果您需要的不仅仅是分配的 X 字段,您也可以使用显式的 getter/setter。

另一种解决方案是使用引用类型(类 f.i.),尽管这对于位置或坐标可能不太实用。

关于delphi - 记录属性的 DWScript setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25255421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com