例如,实现一个资金流入流出的账单记录,当对历史记录进行篡改时,会引发赋值出错,进行数据回滚处理。如此来展示对象算符重载数组set算符时,ifnone(v,i)等功能的作用
//资金出入的联动实现,行标下只能依次递增,否则报错回滚
Type DepositMoney = class()
FMoneyMX;
FlastR; //上行
FnewR; //当前行
function create(v);
begin
FMoneyMX:=array();
FMoneyMX[0]["时间"] := datetimetostr(now());//初始资产
FMoneyMX[0]["当前余额"] := v;//初始资产
FMoneyMX[0]["出金"] := 0;//
FMoneyMX[0]["入金"] := 0;//
FlastR:=-1;
FnewR:=0;
end
function operator[1](idx,v); //设置值
begin
// echo "Idx->",idx," v->",v;
//当赋值出错时,进入该过程,进行回滚
if ifnone(v,-1) then//none类型,且none整数位为-1
begin
//回滚到上一次的状态
FMoneyMX:=FMoneyMX[0:FlastR];
FnewR:=FlastR;
FlastR:=FlastR-1;
echo "发生错误-回滚到变更前状态:",tostn(FMoneyMX);
return "Erro";
end;
if ifnone(v) then //中间层级
begin
// echo "getnone(v)->",getnone(v);//当前级别
if getnone(v)=0 then begin //第一层
FlastR:=FnewR;
FnewR:=idx;
FMoneyMX[idx,"时间"]:=datetimetostr(now());
if FnewR<FlastR+1 then raise "不能对历史数据进行修改,当前最新行标:"$FlastR;
return self;
end
else raise "只支持二维数组";
end
if idx="出金" then
begin
FMoneyMX[FnewR]["当前余额"]:= FMoneyMX[FlastR]["当前余额"]-v;
FMoneyMX[FnewR]["出金"]:= v;
FMoneyMX[FnewR]["入金"]:= 0;
end
else if idx="入金" then
begin
FMoneyMX[FnewR]["当前余额"]:= FMoneyMX[FlastR]["当前余额"]+v;
FMoneyMX[FnewR]["出金"]:= 0;
FMoneyMX[FnewR]["入金"]:= v;
end
end
function destroy();
begin
FMoneyMX := nil;
FlastR := nil;
FnewR :=nil;
end
end
调用测试:
//--事务示例
obj:=new DepositMoney(100);
sleep(1*1000);
obj[1]["入金"]:=888;
echo "入金888->",tostn(obj.FMoneyMX);
sleep(1*1000);
obj[2]["出金"]:=200;
echo "出金200->",tostn(obj.FMoneyMX);
sleep(1*1000);
obj[2]["出金"]:=100; //此时变动下标应该是3,指定2会引发set出现,数据会进行回滚
echo "出金100->",tostn(obj.FMoneyMX);
return obj.FMoneyMX;
执行报错后,打印结果如下:(在 obj[2]["出金"]:=100;时触发出错逻辑,数据回到赋值之前的状态)
入金888->
array(
("时间":"2025-08-12 17:55:40","当前余额":100,"出金":0,"入金":0),
("时间":"2025-08-12 17:55:41","当前余额":988,"出金":0,"入金":888))
出金200->
array(
("时间":"2025-08-12 17:55:40","当前余额":100,"出金":0,"入金":0),
("时间":"2025-08-12 17:55:41","当前余额":988,"出金":0,"入金":888),
("时间":"2025-08-12 17:55:42","当前余额":788,"出金":200,"入金":0))
出金100->
发生错误-回滚到变更前状态:
array(
("时间":"2025-08-12 17:55:40","当前余额":100,"出金":0,"入金":0),
("时间":"2025-08-12 17:55:41","当前余额":988,"出金":0,"入金":888),
("时间":"2025-08-12 17:55:43","当前余额":788,"出金":200,"入金":0))