用[]或者[0]重载读取过程,即实现指定下标时取值的操作,用[1]重载写入过程,即实现指定下标进行赋值的操作。
重载读取定义:operator[](idx[;s]) 或operator[0](index[;s])
重载写入定义:operator[1](idx,v)
其中,idx表示当前下标值,支持整型与字符串
重载读取中,s表示当前层级,中间层从0开始,依次为0,1,2,3,....,最后一层时为-1。
重载写入中,v表示写入的值,但在中间层时它是一个none类型,层级由none类型的值进行确定,最后一层时为写入的值。
[]重载时允许多级,重载中返回对象表示继续下一层
在[0]算符重载时,通过第二个参数可判断当前层级,当小于0时表示当前处于最后一层,重写实现中返回对象表示继续下一层,否则访问结束。
在[1]算符重载时,可通过ifnone(v)判断第二个参数,若为真,表示为中间级,此时实现中返回对象表示继续下一层,判断为真时当前处于最后一层,此时可对该参数值进行赋值操作。
对象算符重载数组set算符时级别的获取与当前状态的判定:
getnone函数可以获得none类型包含的int值。
ifnone(v,i)可以判断是否属于none并且所含整数位i。
当对象重载下标写入行为时,若当前为中间级,则第二个参数为none类型,此时该none类型的值为下标的级别,从0开始,依次为0,1,2,3....。如果写入的过程出现错误,则调用写入方法进行重载,此时进入的none类型值为-1,这样做方便数据库等事务的实现。
例如:实现对对象数组成员的读写-单层的实现
type bb=class
data;
public
function create(v);
begin
data:=v;
end;
function operator[](index);
begin
return data[index];
end;
function operator[1](index,v);
begin
echo "set->",index,"->",v;
data[index]:=v;
end;
end;
调用测试如:
t:=array(1,2,3,4,5);
b:=new bb(t);
a:=b[2];//取值
echo "b[2]:",a;
b[3]:=999; //重新赋值
echo "b.data:",tostn(b.data);
打印如下:
b[2]:3
set->3->999
b.data:
array(1,2,3,999,5)