Delphi新语法 For ..In

首先我们要知道哪些类型可以用For In吧,下面就是:
  • for Element in ArrayExpr do Stmt;      数组
  • for Element in StringExpr do Stmt;    字符串
  • for Element in SetExpr do Stmt;         集合
  • for Element in CollectionExpr do Stmt;   集合
  • for Element in Record do Stmt;         结构体


我们来看例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type
THuangJacky = (hjA,hjB,hjC,hjD);
TJackyHuang = record
     a,b,c: Integer ;
end ;
const
     stringExpr= 'HuangJacky' ;
     arrayExpr: array [ 0..5 ] of  Integer = ( 1 , 2 , 3 , 4 , 5 , 6 );
     setExpr: set  of  THuangJacky = [hjA,hjB,hjD];
procedure  TForm1 . FormCreate(Sender: TObject);
var
     I: Integer ;
     C: Char ;
     D:THuangJacky;
     F:TComponent;
begin
for  c in  stringExpr do
     ShowMessage(C);
for  i in  arrayExpr do
     ShowMessage(IntToStr(i));
for  d in  setExpr do
     ShowMessage(IntToStr(Ord(d)));
for  F in  Self do
     ShowMessage(f . Name);
end ;


是不是很爽呀?哈哈,Delphi也与时俱进呀.

之前写了类助手文章中,老赵问是不是扩展方法,因为对C#没有了解到这么多,所以不知道.
那么我们在Java中要For In必须实现Iterator吧.
那么Delphi的会不会也要呢?
是的,如果我们要自己的类支持For In的话,就必须满足下面的条件:
1 必须有个公共方法GetEnumerator(),这个方法返回值是一个类,接口或者记录体.
2 上面返回的类,接口或者记录体中又必须有公共方法MoveNext(),这个方法的返回值是Boolean.
3 1中返回的类,接口或者记录体中必须有一个只读的属性Current,类型要和集合中的元素一样.

说了这么多,看个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
type
   TMyIntArray = array  of  Integer ;
 
   TMyEnumerator = class
     Values: TMyIntArray;
     Index:  Integer ;
   public
     constructor  Create;
     function  GetCurrent: Integer ;
     function  MoveNext:   Boolean ;
     property  Current:    Integer  read GetCurrent;
   end ;
 
   TMyContainer  = class
   public
    function  GetEnumerator: TMyEnumerator;
   end ;
 
constructor  TMyEnumerator . Create;
begin
   inherited  Create;
   Values := TMyIntArray . Create( 100 , 200 , 300 );
   Index := - 1 ;
end ;
 
function  TMyEnumerator . MoveNext: Boolean ;
begin
   if  Index < High(Values) then
     begin
       Inc(Index);
       Result := True ;
     end
   else
     Result := False ;
end ;
 
function  TMyEnumerator . GetCurrent: Integer ;
begin
   Result := Values[Index];
end ;
 
function  TMyContainer . GetEnumerator: TMyEnumerator;
begin
   Result := TMyEnumerator . Create;
end ;
 
var
   MyContainer: TMyContainer;
   I: Integer ;
 
   Counter: Integer ;
 
begin
   MyContainer := TMyContainer . Create;
 
   Counter := 0 ;
   for  I in  MyContainer do
     Inc(Counter, I);
 
   WriteLn ( 'Counter = ' , Counter);
end .

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值