zoukankan      html  css  js  c++  java
  • 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.

     
    https://blog.csdn.net/rocklee/article/details/48627165
  • 相关阅读:
    Hibernate 组合主键映射
    Hibernate 对象的生命周期及CRUD操作
    Hibernate *.hbm.xml对象关系映射文件详解
    Hibernate.cfg.xml详解
    hibernate4日志配置
    Hibernate第一个程序
    hibernate-release-4.3.11.Final资源包介绍
    (转)开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引
    redis CONFIG REWRITE介绍
    (转)Linux core 文件介绍与处理
  • 原文地址:https://www.cnblogs.com/findumars/p/9362036.html
Copyright © 2011-2022 走看看