TSL语言基础 > Object TSL > 算符重载 > 面向对象的Operator重载支持[]

对象算符重载数组set算符时none类型的应用实例    

  • 例如,实现一个资金流入流出的账单记录,当对历史记录进行篡改时,会引发赋值出错,进行数据回滚处理。如此来展示对象算符重载数组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))