Archive for 9 月, 2008

actionscirpt3 で変数に格納された値を使って動的にインスタンスを生成

以前からできないのかなと思っていて、
ちょっと調べたらできそうだったので調べてみた。
試した環境は Flex3 SDK です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.getDefinitionByName;
 
public class Hoge extends Sprite {
public function Hoge() {
       var cls:Class = getDefinitionByName("flash.text.TextField") as Class;
[...]

月曜日, 9 月 29th, 2008

perlをワンライナーで便利な使い方(compcを使う時に便利)

どうも。久しぶりにエントリー書きます。
今回は compc を使って swc ファイルの作成を行います。
その際になんと、、、、
Class ファイルをすべてコマンドラインから指定してやらないといけないみたいなのです。

1
compc compc -output [作成されるファイル名] -source-path [sourceのある場所] –include-classes [すべてのクラスファイル]

これを実行すると swc ファイルを自分で作成することができます。
ただ何が問題かっていうと、
–include-classes にすべてのクラスファイルを指定しないといけないんです。
org.libspark.asreflect.errors.ASReflectError こんなフォーマットで。
これをファイルパスから取り出すのなんてめんどくさすぎる。
しかも / でなくて . 区切り。
というわけで、そこで perl の登場です。(※ここでは ASReflect を使用しています)
まず file だけを出力し、さらに .svn 以下のファイルを省きます。

1
find -type f | grep -v svn

この結果、出力される形式がこんな感じ

./org/libspark/asreflect/errors/ASReflectError.as
./org/libspark/asreflect/errors/NotFoundError.as
./org/libspark/asreflect/Method.as
./org/libspark/asreflect/Property.as
./org/libspark/asreflect/Parameter.as
./org/libspark/asreflect/Member.as
./org/libspark/asreflect/MetadataAware.as
./org/libspark/asreflect/Metadata.as
./org/libspark/asreflect/Type.as
./org/libspark/asreflect/ASReflect.as
./org/libspark/asreflect/TypeFactory.as
./org/libspark/asreflect/builders/BasicConstantHandler.as
./org/libspark/asreflect/builders/BasicTypeFactory.as
./org/libspark/asreflect/builders/BasicVariableHandler.as
./org/libspark/asreflect/builders/ImplementsInterfaceHandler.as
./org/libspark/asreflect/builders/ExtendsClass.as
./org/libspark/asreflect/builders/ImplementsInterface.as
./org/libspark/asreflect/builders/ParseContext.as
./org/libspark/asreflect/builders/BasicConstructorHandler.as
./org/libspark/asreflect/builders/BasicFactoryHandler.as
./org/libspark/asreflect/builders/ElementHandler.as
./org/libspark/asreflect/builders/BasicTypeHandler.as
./org/libspark/asreflect/builders/BasicAccessorHandler.as
./org/libspark/asreflect/builders/BasicParameterHandler.as
./org/libspark/asreflect/builders/BasicMethodHandler.as
./org/libspark/asreflect/builders/Arg.as
./org/libspark/asreflect/builders/BasicMetadataHandler.as
./org/libspark/asreflect/builders/ArgHandler.as
./org/libspark/asreflect/builders/XmlParser.as
./org/libspark/asreflect/builders/ExtendsClassHandler.as
./org/libspark/asreflect/impls/BasicType.as
./org/libspark/asreflect/impls/MetadataAwareSupport.as
./org/libspark/asreflect/impls/BasicMember.as
./org/libspark/asreflect/impls/BasicParameter.as
./org/libspark/asreflect/impls/BasicProperty.as
./org/libspark/asreflect/impls/BasicMetadata.as
./org/libspark/asreflect/impls/BasicMethod.as

これを整形します。
1. ./ を削除
2. .as を削除
3. / を . に変換
4. 空白区切りで連結して出力
この肯定を行えばいいわけです。
そこで登場するのが perl -p です。 perl -n でもいいです。
違いは改行あるかないか程度です。
これを使うことで

1
2
while(<>){
}

これと等価になるわけです。
つまりは、

1
2
3
4
5
6
7
8
perl -ple ‘chomp; s{\./}{};s{\.as$}{}s;s{/}{.}g’;
 
whild(<>) {
chomp;
[...]

月曜日, 9 月 29th, 2008

actionscirptで変数のブロックスコープを実現する

昔にactionscriptの変数のスコープがfunctionスコープということを知らずに凄いハマったことがあって
それ以来は気をつけてはいたんですが、どうやらブロックスコープを実現できるみたいなので試してみた。
結論から言うと、withを使う。
actionscirpt1のころからwithの存在を知ってはいたけどコード量を短くする以外に使い道もわからなく
そんなに困ることもなく存在すら忘れ去れそうになっていましたw
でも、この子は非常に優秀です。できる子でした。
perlでいうlocalみたいなことができるんです。
素晴らしすぎます。今まで知らなかったことが残念で仕方ありません。
actionscript、javascript共に試したコードをつるしときます。
ver FlashIDE

1
2
3
4
5
6
7
8
9
10
11
var hoge:Number = 8;
 
trace("default:" + hoge); // 8
(function():void {
var hoge:Number = 10;
trace("function:" + hoge); // 10
})();
 
with( {hoge:1} ) [...]

水曜日, 9 月 17th, 2008