ActionScript理解度テスト【その2解答編】Code Comprehension(2/2 ページ)

» 2008年05月14日 06時55分 公開
[新藤愛大,ITmedia]
前のページへ 1|2       

問16.AS2におけるビット演算時の数値の扱い

trace((0xffff0000 | 0x0000ffff));


出力

-1


 一見4294967295になりそうですが、ビット演算をするとなぜかsigned(符号付)値として認識されてしまいます。単に0xffffffffだと違います。

問17.クラスメンバの列挙

public dynamic class Hoge

{

    public var a:uint = 1;

    public var b:uint = 1;

    

    public function Hoge()

    {

        b = 2;

    }

    

    public function calc():uint

    {

        return a + b;

    }

}


var h:Hoge = new Hoge();

h.c = 3;

for (var prop:String in h) {

    trace(prop);

}


出力

c


ActionScript3では、dynamicなクラスに対して、実行時に追加されたプロパティのみが列挙されます。

問18.クラス内withの罠

public class Hoge

{

    public function Hoge()

    {

        var list:Array = [];

        with(list) {

            trace(length);

        }

    }

    

    private var length:uint = 100;

}


var h:Hoge = new Hoge();


出力

100


 withの作用によってlist.lengthが出力されるかと思いきや、バグでメンバ変数のlengthが出力されます。詳しくはこちらを参照してみてください。

問19.Arrayキャストの罠

function add(obj:Object):Array

{

    obj.push.apply(obj, [4, 5]);

    return Array(obj);

}


var obj:Object = [1, 2, 3];

trace(add(obj).length);


出力

1


 Array()は新しい配列を生成する組み込み関数であるため、問題の4行目のようにArray型へキャストしようという意図で使うと失敗します。

問20.代入バグ

var a:uint = 0;

function f():uint { return a++; }


var list:Array = [1,2,3,4,5];

list[f()] += 1;

list[f()] += 1;


trace(list);


出力

3,2,5,4,5


 一見2,3,3,4,5になるように思えますが、Flashのコード生成にバグがあり、次のようなコードが生成されます。

list[f()] = list[f()] + 1;


 つまり、1回の代入演算で関数fが2回呼び出されます。それによって、上記のような結果になります。


 2回にわたってお届けしてきたActionScript理解度テストですが、いかがでしたでしょうか。今回の問題が解けないからといって、ActionScriptの習得をあきらめてしまう必要はまったくありません。ActionScriptで分からないことがあれば、Flash/ActionScript開発のためのオープンソースコミュニティー「Spark project」などで質問すれば、必ず答えにたどり着けるでしょう。あなたがActionScriptのディープな世界へ来るのをお待ちしています。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ