gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

今更的な話なんだけど…

でも、書籍とかでもあんまり書いてないぞ? 的な話。
プログラマとしては必須といってもイイ情報だし、だからこそ「初歩本の一番手前に書いて欲しい」んだけど…。
ちょいと散文(ちょいと?)。


キャストの仕方。
いわゆる()の演算子…例えば

変数 = (キャストしたい型)別の変数;

は、ないぽ。単純にシンタックスエラーになる。

  var t:Label = new Label;
  var b:Box;
  b = (Box)t; /* シンタックスエラー */

次。いにしえからあるらしいキャスト方法は…クラス名+()演算子。DataType(object)という書式になるです。
なんていうか…newが付いていないだけで、new演算子の書式にごっつ似てるので…要注意。いや割とかなり真剣に悩み&ひっかかりました orz

  var t:Label = new Label;
  var b:Box;
  b = Box(t);

こんなげ。もっとも、これ実行すると

TypeError: Error #1034: 強制型変換に失敗しました。mx.controls::Label@1585f0b1 を mx.containers.Box に変換できません。

ってエラーになるけど。


で、ActionScript3で新しく登場したらしい、as演算子

  var t:Label = new Label;
  var b:Box;
  b = t as Box;
trace (b);

これだと、bにはnullが入る。ちなみにnullのチェックは == で簡単にチェックできる。
nullにならず、ちゃんとキャストできる例は、例えばこんなん。

  var t2 = new VBox;
  var b2:Box;
  b2 = t2 as Box;
trace (b2);


余談。
is演算子ってのがあって、それは「変数が指定されたclassの系譜にいてるかどうか」をチェックするみたいです。
微妙に興味ないので、サンプルだけ簡単に。
http://weblogs.macromedia.com/akamijo/archives/2006/01/is.html

var mySprite:Sprite = new Sprite();
trace (mySprite is Sprite); // true が出力される
trace (mySprite is DisplayObject); // true が出力される
trace (mySprite is IEventDispatcher); // true が出力される
-中略-
var mySprite:Sprite = new Sprite();
trace (mySprite instanceof Sprite); // true が出力される
trace (mySprite instanceof DisplayObject); // false が出力される
trace (mySprite instanceof IEventDispatcher); // false が出力され


次。
インスタンスのclass名は、className メソッドがあるです。…まぁ引数で持ってきた時にこのパラメタチェックしてくれてないっぽいので、上述のキャストが色々と必須になる訳なのですが(苦笑
面白いのが、id。
mxmlGUIオブジェクトを作ると、ID名がそのまんまインスタンス名になるですが。
Scriptでnewすると、当然ながらID名はカラッポ(null)になってるです。普通に

  t.id = "t";  

とかでつっこめるので。ユニーク(一意)であることを条件にではありますが、できるだけ、部品にはID名ぶち込んでおいたほうが後々楽だと思う。
いわゆる礼儀とか躾とか嗜みとかってやつですか?
mxml

<mx:VBox id="vvv">
<mx:TextInput id="ti" width="200"  />


Script

trace(  ti.className );
trace(  ti.id );

  var t:Label = new Label;
  t.text = 'text 1';
trace(  t.className );
trace(  t.id );

  t.id = "t";  
trace(  t.className );
trace(  t.id );


次。…基本的にGUIインスタンスってApplicationのクラス変数(?)になるようなのですが。
なので、アクセスは

<mx:TextInput id="ti" width="200"  />

の場合

trace(  this.ti.id );
trace(  ti.id );

というアクセス方法は一般的ですし知られていると思うのですが。
ぢつはもう一つあるです。

  var wk:String = "ti";
trace(  this[wk].id );

まぁびっくり[]演算子使えるですねぇ。


…この辺知ってたら、もっときれいに書けたのに orz


あと。演算子…なんか色々あるですが。PHPと同様、==と===があるぽいです orz
http://livedocs.adobe.com/flex/2_jp/langref/operators.html#equality

2 つの式の等価性をテストします。式が等しい場合、結果は true です。

2 つのオペランドのデータ型が一致する場合、等価の定義はオペランドのデータ型によって決まります。

* int、uint、および Boolean 型の値は、値が同じ場合に等しいと見なされます。
* Number 型は、値が同じで両方とも NaN でない場合に等しいと見なされます。
* 2 つのオペランドの値が null または undefined の場合は、等しいと見なされます。
* ストリング式は、文字数が同じで、同じ文字で構成されている場合に、等しいと見なされます。
* XML オプジェクトの場合 :
o 一方のオペランドがテキストまたは属性ノードで、もう一方のオペランドに単純内容が含まれる場合は、オペランドを両方とも toString() メソッドでストリングに変換し、結果のストリングが一致する場合に等しいと見なされます。
o それ以外の場合、オブジェクトは、両方のオブジェクトの修飾名、属性、および子プロパティが一致する場合にのみ等しいと見なされます。
* XMLList オブジェクトの場合は、プロパティの数が同じで、プロパティの順序および値が一致する場合に等しいと見なされます。
* Namespace オブジェクトの場合は、両方のオブジェクトの uri プロパティが一致する場合に値が等しいと見なされます。
* QName オブジェクトの場合は、両方のオブジェクトの uri プロパティおよび localName プロパティが一致する場合に値が等しいと見なされます。
* オブジェクト、配列、および関数を表す変数は、参照により比較されます。2 つの変数が同じオブジェクト、配列、または関数を参照する場合、それらの変数は等価です。2 つの別個の配列は、エレメント数が同じである場合でも、等しいとは見なされません。

オペランドのデータ型が一致しない場合は、次の場合を除き、結果は false になります。

* オペランドの値が undefined および null の場合。この場合、結果は true になります。
* 自動データ型変換により String、Boolean、int、uint、および Number のデータ型の値が互換性のある型に変換され、変換された値が等しい場合。この場合、オペランドは等しいと見なされます。
* 一方のオペランドが単純内容 (hasSimpleContent() == true) を持つ XML 型で、両方のオペランドを toString() メソッドでストリングに変換し、結果のストリングが一致する場合。
* 一方のオペランドが XMLList 型で、次のいずれかの条件に該当する場合。
o XMLList オプジェクトの length プロパティが 0 で、もう一方のオブジェクトが undefined である。
o XMLList オプジェクトの length プロパティが 1 で、XMLList オブジェクトの 1 つのエレメントがもう一方のオペランドに一致する。

おまけ。
http://livedocs.adobe.com/flex/2_jp/langref/operators.html#strict_equality
一回チェックせんと、ですかねぇ…
あと。上述、2なので。本当は
http://livedocs.adobe.com/flex/3_jp/langref/operators.html#equality
とかを見た方が良いと思う…っていう手抜きw


そうそう。演算子一覧はここ。
http://livedocs.adobe.com/flex/3_jp/langref/operators.html


いぢょ ノ