多數是用Array 和List的應用可能希望循環其中包含的值。事實上,List已經為了這個目的高度定制,幾乎不用對其內容進行迭代操作。為了達到這點,每個Haxe的集合對象都提供一個方法 iterator() 。這個方法返回一個迭代對象的副本,包含集合的項,可以被傳遞到過程中,就像一個 for 循環:
~~~
var myArray : Array < String > = [“item1”, “item2”, “item3”];
var arrIter = myArray.iterator();
for ( i in arrIter )
{
trace( i );
}
~~~
例子顯示了數組中的每個項。然而,有一個更簡單的方法。作為一個便利性, for 循環發生能夠直接從任何對象暴露的iterator()方法提取迭代器對象返回類型為 Iterator<T> 。這里 <T> 是一個占位符,用來指定迭代器中保存的值的類型,所以在這個例子,iterator()的返回類型將是Iterator<String>:
~~~
var myArray = [“item1”, “item2”, “item3”];
for ( i in myArray )
{
trace( i );
}
~~~
# 直接訪問集合項
* * * * *
迭代對象中存儲的值會傳遞任何相關集合中包含的值的副本,如果值得類型不是一個對象的話;否則一個引用將被傳遞。這可能有一點小麻煩如果你希望修改存儲在Array中的值并希望這些修改在循環結束后永久保存的話。看一下下面的例子:
~~~
var myArray = [“item1”, “item2”, “item3”];
for ( i in myArray )
{
i += “0”;
trace( i );
}
trace( myArray[0] );
// Outputs: item1
~~~
當值被輸入到屏幕,可以看到每個項被添加了字符 0 ,然而當第一個項在for循環外查詢,則丟失了附加的字符。有時,這坑你是你想要的效果,但是如果不是呢?
這種情況,你可以抽象迭代器的使用通過使用IntIter 對象并設置它的最大值為數組長度。這種方式,可以直接訪問數組項并保證項被修改。用這個方法,你的前一個例子看起來應該是:
~~~
var myArray = [“item1”, “item2”, “item3”];
for ( i in 0...myArray.length )
{
myArray[i] += “0”;
trace( myArray[i] );
}
trace( myArray[0] ); // Outputs: item10
~~~
在運行的示例中,添加到第一個項的字符是永久性的,或者至少應用結束之前是。
# 迭代Map
* * * * *
Map對象暴露一個 iterator() 方法,和Array 跟 List 對象類似。然而,只有包含的項的值會被傳遞到迭代器。因為這些對象的索引是通過使用鍵來訪問,不能使用 IntIterator 對象來直接訪問他們包含的值,除非對象是一個 IntMap,帶有連續的key。為了解決這個問題,一個任何類型的實例提供一個keys() 方法,可以返回一個迭代器包含集合中用到的key。一旦實現這個,迭代器就可以用來替代 IntIter 對象來直接訪問集合項:
~~~
var myMap = new Map<String,String>();
myMap.set("one", "doh");
myMap.set("two", "ray");
myMap.set("three", "me");
for (i in myMap.keys())
{
myMap.set(i, myMap.get(i) + "#");
trace(myMap.get(i));
}
trace(myMap.get("one"));
~~~
- 本書目錄
- 第一章: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
- 附加部分