Haxe 里的 for 循環和C、Java里面的for 循環非常不同,而是更像常見的 foreach 循環。但這并不是說它是一個 foreach 循環,因為顯然不是,只是某些范圍相似,Haxe的 for 循環迭代對象和值而不是循環直到指定的表達式返回true 。
Haxe 的 for 循環直接關聯可迭代的對象。迭代器將在后面學習,對于這個解釋,你可以檢查默認的迭代器:IntIter 對象。在此之前,最好是說明什么是迭代器。一個迭代器是一個對象,代表一個可迭代的值。
這可能是一個對象列表或者值的列表,包含在一個數組中,一個數值從一個指定最小的值到指定最大的值排列,甚至是字母表里的字母。迭代器通過暴露的兩個方法提供值:hasNext() 和 next() 。hasNext() 方法不需要參數,如果還有更多的對象等待迭代則會返回true,否則返回false 。next() 方法也不需要參數,返回迭代堆棧里的下一個對象。
無論如何,Haxe中許多的類型和處理使用了迭代器,都會自動訪問這兩個方法。 for 循環是其中一個。
# IntIter對象
* * * * *
前面說過,IntIterator 是最基礎的可用迭代器,也是在Haxe應用中最常用的,因為它在從一個指定Int類型值到另一個值得迭代中提供了援助。第一次實例化它為一個數組然后提供它最小值和最大值之后就可以使用 IntIterator 對象,這兩個值分配給隱藏的標記為min和max的變量。然后傳遞一個變量標識符,和實例化的對象到for 循環來迭代,使用 in 關鍵字隔開它們,像這樣:
~~~
var iter = new IntIterator(0,10);
for ( i in iter )
trace ( i );
~~~
循環運行后,進行下面的步驟:
1. for 循環檢查迭代器對象有可迭代的值,通過調用它的 hasNext() 方法。這個方法計算最小值是否小于最大值,并返回語句的結果。如果為true,那么至少還有一個值等待迭代,否則推出for 循環。
2. in 關鍵字分配迭代器的 next()方法 返回值到 in 關鍵字左邊提供的變量。這個賦值采用和 myInt = min 相同的方式,如果要賦值的值不是一個對象,那么一個拷貝會被賦值,否則對象的引用被賦值。在IntIterator的情況里,總是賦值一個 Int 。
3. 在min被賦值后,它會被增加 1 準備進入下一個循環。一旦for 循環提供的代碼唄執行,過程則重復 step 1 。
因為 min 的值必須小于 max,循環中提供的數值范圍不會等于 max 變量的值。因此,在例子中,循環會輸出0到9到屏幕。
當提供在for循環語句中給 in 關鍵字左側的變量,不用使用 var 聲明,因為變量會為你聲明好。
# IntIterator操作符
* * * * *
對比其他的迭代器類型,IntIterator迭代器很特別,因為可以被聲明并且通過使用迭代器操作符(...)自動實例化,可以重寫前面的例子:
~~~
for ( i in 0...10 )
trace( i );
~~~
IntIter迭代器不能以遞減的方式運作,所以計算從10到0,雖然編譯可以通過,但是不會執行循環。然而,你可以使用一些技巧模擬這個過程,通過從最大值減去比當前迭代值大1的:
~~~
for ( i in 0...10 )
trace( 10 - ( i + 1 ) );
~~~
- 本書目錄
- 第一章:Haxe介紹
- 互聯網開發的一個問題
- Haxe是什么,為什么產生
- Haxe編譯工具
- Haxe語言
- Haxe如何工作
- 那么Neko是什么
- Haxe和Neko的必須條件
- 本章摘要
- 第二章:安裝、使用Haxe和Neko
- 安裝Haxe
- 使用Haxe安裝程序
- 在Windows上手動安裝Haxe
- Linux上手動安裝Haxe
- 安裝Neko
- Windows上手動安裝Neko
- 在Linux上安裝Neko
- Hello world! 一式三份
- 編譯你的第一個Haxe應用
- 你的程序如何編譯
- HXML編譯文件
- 編譯到Neko
- 編譯為JavaScript
- 程序結構
- 編譯工具開關
- 本章摘要
- 第三章:基礎知識學習
- Haxe層級結構
- 標準數據類型
- 變量
- 類型推斷
- 常數變量
- 簡單的值類型
- 浮點類型
- 整型
- 選擇數值類型
- 布爾類型
- 字符串類型
- 抽象類型
- Void 和 Null
- 動態類型
- unknown類型
- 使用untyped繞過靜態類型
- 注釋代碼
- 轉換數據類型
- Haxe數組
- Array
- List
- Map
- Haxe中使用日期時間
- 創建一個時間對象
- Date組件
- DateTools類
- 操作數據
- 操作符
- Math類
- 使用String函數
- 本章摘要
- 第四章:信息流控制
- 數據存放之外
- 條件語句
- if語句
- switch語句
- 從條件語句返回值
- 循環
- while循環
- for循環
- 循環集合
- Break和Continue
- 函數
- 類的函數
- 局部函數
- Lambda類
- 本章摘要
- 第五章:深入面向對象編程
- 類和對象
- 實例字段
- 靜態字段
- 理解繼承
- Super
- 函數重載
- 構造器重載
- toString()
- 抽象類和抽象方法
- 靜態字段,實例變量和繼承
- 繼承規則
- 使用接口
- 高級類和對象特性
- 類的實現
- 類型參數
- 匿名對象
- 實現動態
- Typedef
- 擴展
- 枚舉
- 構造器參數
- 本章摘要
- 第六章:組織你的代碼
- 編寫可重用代碼
- 使用包
- 聲明一個包
- 隱式導入
- 顯式導入
- 枚舉和包
- 類型查找順序
- 導入一個完整的包
- 導入庫
- Haxe標準庫
- Haxelib庫
- 其他項目中的庫
- 外部庫
- 使用資源
- 文檔化代碼
- 離線文檔
- 在線文檔
- 單元測試
- haxe.unit包
- 編寫測試
- 本章摘要
- 第七章:錯誤調試
- trace函數
- trace輸出
- haxe的trace和ActionScript的trace
- 異常
- 異常處理
- CallStack和ExceptionStack
- 異常管理類
- 創建完全的異常處理類
- 異常類代碼
- 本章摘要
- 第八章:跨平臺工具
- XML
- XML剖析
- Haxe XML API
- 正則表達式
- EReg類
- 模式
- 定時器
- 延遲動作
- 隊列動作
- MD5
- 本章摘要
- 第九章:使用Haxe構建網站
- Web開發介紹
- Web 服務器
- 使用Web服務器發布內容
- HTML速成課程
- Haxe和HTML的區別
- NekoTools Web Server
- Apache安裝mod_neko
- Windows安裝Apache和mod_neko
- Linux安裝Apache和Mod_Neko
- 第一個Haxe網站
- 使用Neko作為網頁Controller
- neko.Web類
- Neko作為前端控制器
- 本章摘要
- 第十章:使用模板進行分離式設計
- 什么是模板
- Template類
- Template語法
- 使用資產
- 何時在模板中使用代碼
- 服務器端模板的Templo
- 安裝Templo
- 使用Templo
- haxe.Template和mtwin.Templo表達式上的區別
- Attr表達式
- Raw表達式
- 邏輯表達式
- 循環表達式
- set, fill, 和 use表達式
- Templo中使用宏
- 手動編譯模版
- 第十一章:執行服務端技巧
- 第十二章:使用Flash構建交互內容
- 第十三章:使用IDE
- 第十四章:通過JavaScript制作更多交互內容
- 第十五章:通過Haxe遠程通信連接所學
- 第十六章:Haxe高級話題
- 第十七章:Neko開發桌面應用
- 第十八章:用SWHX開發桌面Flash
- 第十九章:多媒體和Neko
- 第二十章:使用C/C++擴展Haxe
- 附加部分