んと…まずiterator近辺は…多分、ないです。…見落としてるだけかもしれませぬが。
foreachは…二種類あります orz
まず。
いわゆる一般的な手続き型言語でのイメージとしてのforeach(PerlとかPHPとかJava(5.0+)とかC#とかDとかPython(for文だけどforeachと等価だよねぇ)とかVBとかcshとかsh系シェルとか)は…こんな感じ。
//
var awk:Array = ["a", "b", "c", 123];
for each (var obj in awk) {
trace (obj.toString());
}まぁ当然といえば当然なのですが、objは「実値のcopy」なので。値を操作してもなんの意味もありません。
//
var awk:Array = ["a", "b", "c", 123];
//
for each (var obj in awk) {
trace (obj.toString());
obj = obj + " add";
}
trace (awk.toString());ついでに。似たような書式でfor in というのがあるのですが…これは「indexを返す」だけなので。ちょいと物足りない可能性があります。
//
var awk:Array = ["a", "b", "c", 123];
//
for (var obj in awk) {
trace (obj.toString());
}
次に。「Arrayクラス(…以外にあるのかは不明。少なくともArrayクラスには、程度のニュアンスで捉えてください)にあるforEachというメソッド」という角度が存在します。
で、この子が………callback系の実装をしています。
サンプル1
とある関数 {
//
var awk:Array = ["a", "b", "c", 123];
//
awk.forEach(ff);
}
private function ff(item:*, index:int, array:Array):void
{
trace("foreach start");
trace(item.toString());
trace(index.toString());
trace(array.toString());
trace("foreach end");
}
…少々微妙ではありますが(好みの問題ともいう…で、おいちゃん的にはまったく好みぢゃない)。
とりあえず、処理は可能。
で…疑問。
「foreach内で要素変更は可能か?」言い換えると「refererなのか実値のcopyなのか」。
結論「referer」。
で、サンプル2
とある関数 {
//
var awk:Array = ["a", "b", "c", 123];
//
awk.forEach(ff);
}
private function ff(item:*, index:int, array:Array):void
{
//Alert.show("foreach start");
//Alert.show(item.toString());
//Alert.show(index.toString());
//Alert.show(array.toString());
//Alert.show("foreach end");
trace("foreach start");
trace(item.toString());
trace(index.toString());
trace(array.toString());
trace("foreach end");
array[index] = array[index] + " added";
trace(item.toString());
trace(array.toString());
trace("foreach end");
}
次。callback関数に「クラスインスタンス+メソッド」は可能か?
答え。可能。
package
{
public class foo
{
public function foo()
{
}
public function f(item:*, index:int, array:Array):void
{
trace("foo foreach start");
trace(item.toString());
trace(index.toString());
trace(array.toString());
trace("foo foreach middle");
array[index] = array[index] + " added";
trace(item.toString());
trace(array.toString());
trace("foo foreach end");
}
}
}とある関数 {
//
var awk:Array = ["a", "b", "c", 123];
//
var f:foo = new foo;
awk.forEach(f.f);
}
基本的なloopだってぇのに…まぁ盛りだくさん(苦笑
ただ…おいちゃん的には、iterator実装が欲しかったなぁ、とか思うのですが…どんなもんなんですかね?