企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
多数是用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")); ~~~