ActionScriptのDictionary型とObject型の違い
ActionScriptで,オブジェクトへの参照を配列のキーとして持ちたい場合がある.そんなときに使えるのがDictionary型だ.しかしながら,Dictionary型を使わなくてもObject型にもオブジェクトへの参照をキーとして持たせられるように見えた.
FN0912002 - Dictionary()コンストラクタ - Flash : テクニカルノート には,Dictionary型の特徴は,オブジェクトへの参照をキーとして持てることだと書いてある.そこで,両者の違いを調べるために,簡単なコードを書いてみた.コードは以下のとおり.
package { import flash.display.MovieClip; import flash.display.Sprite; import flash.utils.Dictionary; public class ActionScriptTest extends Sprite { public function ActionScriptTest() { var myObj:Object = new Object(); var mc:MovieClip = new MovieClip(); mc.name = "hoge"; var mc2:MovieClip = new MovieClip(); myObj[mc2] = mc; trace(myObj[mc2].name); // hoge var mc3:MovieClip = new MovieClip(); trace(myObj[mc3].name); // hoge trace(myObj['[object MovieClip]'].name); // hoge var dic:Dictionary = new Dictionary(); dic[mc2] = mc; trace(dic[mc2].name); // hoge trace(dic[mc3].name); // error!! } } }
このコード中では,myObjにおいてmc2のオブジェクトへの参照をキーとして使って,mcへの参照を作っている.
期待する動作としては,mc2への参照をキーとして使ったときのみmcへとアクセス可能な状態ができていて欲しい.
しかしながら,実際にはmc3を用いたときにもmcへとアクセスできてしまう.Object型においてオブジェクトの参照をキーとして使ったときは,そのオブジェクトの文字列表現か何かを使うことになる.例えば,MovieClip型のオブジェクトをtraceすると,どのMovieClip型に対しても[object MovieClip]と表示される.そして,その文字列表現が同じとみなされるため,mc2を添字にしても,mc3を添字にしてもmcにアクセスできたのだろう.
一方,Dictionary型の方ではmc2とmc3を添字にした場合でははっきりと区別される.上記のコードのtrace(dic[mc3].name);の部分ではちゃんとエラーが出てくれることからも区別されていることが分かる.
ということで,オブジェクトへの参照を使うときはDictionary型を使いましょう.