AS3の最近のブログ記事

以前に書いた記事 「boolean型の値は false=0,true=1 になっている」 で記載した内容に関して、一部誤りが発覚しましたので、こちらにその検証の続きを記載します。

解釈が誤っていた点

★ false=0 / true=1 ではなくて、 0=false / 0以外の値は true となる

 

下記のソースで検証します。
if文の条件に true/false ではなく、0, 1, 255 という数字を使用して評価します。評価対象になった場合には、VBoxコンテナの中にLabelを追加してメッセージを表示するつくりになっています。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" horizontalAlign="center" creationComplete="onCreationComplete()">

<mx:Script>
    <![CDATA[
        import mx.controls.Label;
        
        private function onCreationComplete():void
        {
            if (0) {
                 addLabel("0");
                 trace(0 as Boolean);
            }
            
            // 評価される → as演算子でキャストした結果は「true」
            if (!0) {
                addLabel("!0");
                trace(!0 as Boolean);
            }
            
            // 評価される → as演算子でキャストした結果は「null」
            if (1) {
                addLabel("1");
                trace(1 as Boolean);
            }
            
            if (!1) {
                addLabel("!1");
                trace(!1 as Boolean);
            }
            
            // 評価される → as演算子でキャストした結果は「null」
            if (255) {
                addLabel("255");
                trace(255 as Boolean);
            }
            
            if (!255) {
                addLabel("!255");
                trace(!255 as Boolean);
            }     
        }
        
        private function addLabel(msg:String):void
        {
            var lbl:Label = new Label();
            lbl.text = "「" + msg + "」 は評価されました";
            showList.addChild(lbl);
        }
        
    ]]>
</mx:Script>

    <mx:VBox id="showList" horizontalAlign="center" fontSize="15" fontWeight="bold" />

</mx:Application>

【実行結果】

booleanEvaluation.png

実行結果としてわかったことは、

  • 「0」という数字は false として評価される
  • false の否定である 「!0」 は true として評価される (当たり前ですが…)
  • 「0」以外の数字は、条件式ですべて true として評価される
  • 「0」以外の数字は as演算子でキャストすると null になっている (Booleanでキャストできていない)

ソースにはありませんが、if("あああ")  などの様に文字列を使用した場合にも、必ず true として評価されていました。

つまり、 boolean型の true/false の代替としては、0 を false の代わりに使うことはできるが、0 以外の値はすべて true と評価されてしまうので使用することができないことがわかりました。

もしかしたら当たり前のことなのかもしれませんが、個人的には結構びっくりしたので覚書として記事に残しておきます。

下のサンプルは、ボタンをクリックすると 以下の処理を行います。
① Mathクラスのrandomメソッドを呼び 乱数を取得する
② 乱数値が奇数か偶数かを判別し、奇数ならば Boolean型の変数 oddNumを"true"に、偶数ならば"false"(デフォルト値) とします
③ oddNum 変数の評価を true/false の替わりに 1/0 で行います

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" horizontalAlign="center">
<mx:Script>
    <![CDATA[
    
        private function getNum():void
        {
            var num:int;
            var oddNum:Boolean;
            
            num = Math.random() * 10;
                        
            if(num%2 > 0){
                oddNum = true;
            }
            
            if(oddNum == 0){
                numLabel.text = num + "は偶数です";
            }else if(oddNum == 1){
                numLabel.text = num + "は奇数です";
            }else{
                numLabel.text = "0 にも 1 にも入りませんでした";
            }
	} 
  ]]> 
</mx:Script> 
<mx:Label id="numLabel" text="下のボタンをクリックして数値を取得してください" fontSize="15" 
 color="#FFFFFF" fontWeight="bold"/> 
<mx:Button label="クリックして数値を表示" click="getNum()" width="200" height="30"/> 
</mx:Application>

boolean の評価を true/false ではなく 1/0 でできることにより得られるメリットはこれと言って浮かばないのですが・・
ビルド時にも実行時にも怒られず、型変換の意識もせずにすんなりと動いてしまうのはちょっと恐いかなと。
意図的にはやらないとは思いますが、こんなこともできてしまうのだと気をつけたいと思います。

なんとなくですが、AMFのパケットの中身はどうなっているのだろうか?と思い立って調べてみました。

Googleで、「AMF パケット 仕様」で調べた結果、AdobeがAMF規格の仕様をPDFファイルで公開していたのを見つけました。

AMF0  http://opensource.adobe.com/wiki/download/attachments/1114283/JP_amf0_spec_121207.pdf
AMF3  http://opensource.adobe.com/wiki/download/attachments/1114283/JP_amf3_spec_121207.pdf

上のPDFですと私自身はいまひとつ分かりにくかったので、以下表にして簡単にまとめてみました。

AMFパケットの仕様

項目 説明
AMFパケットのバージョン  U16 AMFパケットのバージョン
AMF3=3
AMF0=0
ヘッダー数  U16 ヘッダーの数

 ヘッダー

※ヘッダー数分繰り返す

 ヘッダー名称サイズ  U16  ヘッダー名称の文字列長
 ヘッダー名称  UTF8 ヘッダー名称
文字列の長さはヘッダー名称サイズ
 ヘッダーのバイト長  U32 ヘッダーのバイト長
※わからない場合は(U32)-1
 value-type    
 AMFメッセージ数  U16  AMFメッセージ(ボディ)の数

 AMFメッセージ部

※AMFメッセージ数分繰り返す

 ターゲットURIサイズ  U16  ターゲットURIの文字列長
 ターゲットURIサイズ  UTF8  ターゲットURI名称
文字列の長さはターゲットURIサイズ
 レスポンスURIサイズ  U16  レスポンスURIの文字列長
 レスポンスURIサイズ  UTF8  レスポンスURI名称
文字列の長さはレスポンスURIサイズ
 メッセージのバイト長  U32  メッセージのバイト長
※わからない場合は(U32)-1
 value-type    

U8 = 符号なしのバイト、8 ビットのデータ、オクテット
U16 = ビッグエンディアン(network)バイトオーダで記された符号なしの16 ビット整数
U32 = ビッグエンディアン(network)バイトオーダで記された符号なしの32 ビット整数

 ドキュメントを読んでも、value-type の部分がいまいち謎です。

こういうことに今まで興味がわかなかったのは技術者としては?でしょうが、今回調べたことでAMFの中身についてある程度知ることができました。
そのうち、パケット解析ツールなどを使用して実際のデータを除いてみたいと思います。

1

このブログについて

このブログは吉祥寺にあるブレインチャイルド株式会社の社員で投稿しています。
業務ではまってしまったことや発見したこと。
自分達で新たに学習してみようと思って勉強し始めたことなどを綴っています。
こんな社員が働いているブレインチャイルドに興味がわいててきたなら、是非お問い合わせください。
会社案内
求人案内
先輩のコメント