0

私は本当にばかげたことをしているかもしれませんが、以下のコードが機能しない理由がわかりません...

ここでは、spellbook という汎用オブジェクトを作成します。

// A list of all the player's spells
public var spellBook:Object = {};

ここでは、スペルブックにキーと値のペアを追加します。

spellBook["bubble"] = new BubbleSpell(spellBook);

そしてここで、スペルブックの内容を出力しようとしています:

trace("Spells initialised.  Available spells are:");
for each (var _spell:String in spellBook)
{
    trace("  ", _spell, " : ", spellBook[_spell]);
}

しかし、これは私が得る出力です:

Spells initialised.  Available spells are:
   [object BubbleSpell]  :  undefined

私が得られないのは、出力されない理由です:

Spells initialised.  Available spells are:
   bubble : [object BubbleSpell]

??

キーではなく、スペルブックの値を反復処理しているようです...これは何が起こっているのでしょうか? これまでに見たすべてのドキュメントは、これが辞書を反復処理する正しい方法であることを示しているようです (ジェネリック オブジェクトの種類は...) ジェネリックの値ではなくキーを取得するメソッドを呼び出す必要がありますか?オブジェクト?

混乱している!

4

2 に答える 2

6

for each値を反復するために使用される場合、forキーを反復するループを使用する必要があります。次に例を示します。

var mySpells = { 
    speedy: new SpeedySpell(),
    sleepy: new SleepySpell()
};

for (var key : String in mySpells) {
    trace("key: " + key + " value: " + mySpells[key]);
}

a のキーを反復処理するときは、値を型なし ( )Dictionaryのままにしておく必要があることに注意してください。辞書のキーは任意の型にすることができます (一方、 anのキーは型のみにすることができます)。key*ObjectString

一般的なトリックは、オブジェクトのキーを抽出してArray反復を容易にするユーティリティ関数を作成することです。

function getKeys(source : Object) : Array {
    const result : Array = [];
    for (var key : * in source) {
        result.push(key);
    }
    return result;
}

次に、このヘルパー関数を利用できます。

trace(getKeys(mySpells));
于 2012-05-02T09:49:17.550 に答える
4

for eachループを使用しているからです。for代わりにループを使用します。

for (var key:* in spellBook) {
    trace(key + ': ' + spellBook[key]);
}
于 2012-05-02T09:49:01.263 に答える