trace((0xffff0000 | 0x0000ffff));
-1
一見4294967295になりそうですが、ビット演算をするとなぜかsigned(符号付)値として認識されてしまいます。単に0xffffffffだと違います。
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なクラスに対して、実行時に追加されたプロパティのみが列挙されます。
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が出力されます。詳しくはこちらを参照してみてください。
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型へキャストしようという意図で使うと失敗します。
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のディープな世界へ来るのをお待ちしています。
ActionScript | テスト | Code Comprehension | Flash | Adobe Systems(アドビシステムズ) | プログラミング | Open Screen Project
Copyright © ITmedia, Inc. All Rights Reserved.