演算子asとis [Edit]

演算子asisは、つぎのような同じシンタックスで使われます。

インスタンス 演算子 クラス

[ヘルプ]でそれぞれの演算子を調べると、asはインスタンスがクラスの「メンバーであるかどうかを評価」し、isはインスタンスがクラスと「互換性があるかどうかを評価」すると説明されています。要するに何をするのか、これだけではわかりません。

しかし、それぞれの「結果」が異なりますので、使い途もまた違います。演算子asはデータの評価換えに用いられ、isは誰の子かを調べます。

as演算子

まず、as演算子は、指定したクラスでデータ型を評価し直します。そのクラスのインスタンスとして扱えれば評価を換え、それができなければnullとします(「as演算子」参照)。

var mySprite:Sprite = new MovieClip();
// var my_mc:MovieClip = mySprite;   // データ型不一致のエラー
var my_mc:MovieClip = mySprite as MovieClip;   // MovieClipで評価換え

データ型の明示的な変換は「キャスト」と呼ばれ、通常つぎのシンタックスで記述されます。

クラス(インスタンス)

上の例であれば、以下のようなステートメントでキャストできます。

var my_mc:MovieClip = MovieClip(mySprite);   // MovieClipにキャスト

as演算子のとの関わりでは、ふたつ注意すべきことがあります。第1に、as演算子はデータ型を「評価し直す」だけで「変換」しません。

var n_str:String = "1";
trace(Number(n_str));   // 出力: 1 ←文字列を数値に変換
trace(n_str as Number);   // 出力: null ←Numberではないのでnullと評価

第2に、Arrayインスタンス(配列)は、明示的な型変換が使えません。関数Array()として認識され、引数をエレメントとする新たな配列インスタンスがつくられてしまうからです(「配列(Array)にキャストする」参照)[*1]

var obj:Object = [0, 1];
var _array:Array = Array(obj);
trace(_array[0]);   // 出力: 0, 1 ←インデックス0に[0, 1]がエレメントとして格納
trace(_array.length);   // 出力: 1 ←エレメント数はひとつ

この場合には、as演算子を使う必要があります。

var _array:Array = obj as Array;
trace(_array);   // 出力: 0, 1
trace(_array[0]);   // 出力: 0 ←インデックス0がもとの配列と同じ
trace(_array.length);   // 出力: 2 ←エレメント数はふたつ

is演算子

他方、is演算子は、インスタンスがクラスを継承するかどうか調べるために使われます。そして、継承すればtrue、継承しなければfalseとなります。

var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite); // 出力: true ←Spriteのインスタンス
trace(mySprite is DisplayObject); // 出力: true ←SpriteはDisplayObjectを継承
trace(mySprite is MovieClip); // 出力: false ←SpriteはMovieClipを継承しない

isとよく似た演算子にinstanceofがあります。もっとも、instanceofを使うと古い演算子だとされて、isを使うよう警告が表示されます。ふたつの演算子の違いは、isがインタフェースの実装も含めて評価することです。

import fl.controls.Button;
import fl.managers.IFocusManagerComponent;
var myButton:Button = new Button();
trace(myButton is IFocusManagerComponent);   // 出力: true ←ButtonはIFocusManagerComponentを実装
trace(myButton instanceof IFocusManagerComponent);   // 出力: false

[*1] Flash CS4 Professionalでは、Array()はキャストに使えない旨のコンパイラ警告が表示されます(コンパイラ警告1113)。もっとも、そのメッセージは、つぎのように意味不明です。

Array型に値をキャストして、Array(x)の代わりに式xをArrayとして使用します。

正しくは、「値をArray型にキャストするには、Array(x)に替えてx as Arrayという式を使います」とすべきです(「Flash CS4 Professionalヘルプ正誤表」の「コンパイラ警告1113」参照)。asを邦訳してはいけません。ご参考までに、原文はつぎのとおりです。

To cast a value to type Array use the expression x as Array instead of Array(x).

なお、[コンパイルエラー]パネルに表示されるこの警告のコードは、[ヘルプ]に記載されている1113ではなく、1112です(前出「Flash CS4 Professionalヘルプ正誤表」参照)。

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事