实际对对象进行for in循环时,对对象的data属性进行循环操作。
a:=array("A","B","C");
echo "For in table---------\r\n";
for n,v in a do
begin
echo n,"->",v,"\r\n";
end;
echo "For in obj-一个变量---------\r\n";
c1:=new c(a);
for n in c1 do
begin
echo n,"\r\n";
end;
echo "For in obj-两个变量---------\r\n";
for n,v in c1 do
begin
echo n,"->",v,"\r\n";
end;
return;
type c=class
public
data;
lengtD;
findex;
function create(v);
begin
data:=v;
lengtD:=length(v);
end;
function operator for(flag);//flag控制参数个数,n,v
begin
n:=flag .& 2;//n即为高位数值,1表示两个变量,0表示只有一个变量
b:=flag .& 1;//b即为低位数值,1表示不是第一次循环,0表示第一次循环
echo "--for--:",flag," flag高位:",n," flag低位:",b,"\r\n";
if not b then //循环开始初始化
findex:=0
else if findex<lengtD-1 then findex++; //循环过程非初始化
else return nil;//循环结束
if n then//for i,v in 方式,返回对应I,v的值
return array(findex,data[findex])
else//for i in 方式,返回对应I的值
return findex;
end;
end;
打印结果:
For in table---------
0->A
1->B
2->C
For in obj-一个变量---------
--for--:0 flag高位:0 flag低位:0
0
--for--:1 flag高位:0 flag低位:1
1
--for--:1 flag高位:0 flag低位:1
2
--for--:1 flag高位:0 flag低位:1
For in obj-两个变量---------
--for--:2 flag高位:2 flag低位:0
0->A
--for--:3 flag高位:2 flag低位:1
1->B
--for--:3 flag高位:2 flag低位:1
2->C
--for--:3 flag高位:2 flag低位:1
解析:通过上面的过程可以看出,我们可以在对象中对for in操作进行重载实现,通过对flag的控制,可以实现每次循环过程中对对象的操作。
打印结果中,两个循环变量的循环中,高位值为2是因为代表二进制数值0b10,即二进制中高位为1。