functionの引数が取れない。調査中にFlexBuilderが壊れてコンパイルできなくなったので今修復中。
>eclipse3.3にFlexBuilder3入れて復旧。
で、試したのは次のコード。
//テスト用クラス package{ public class FunctionTest{ public var value:int; public function test(arg:String,arg2:String="default"):void{ trace(arg + value + arg2); } } } //実行 public function main():void { var functionTest:FunctionTest = new FunctionTest(); functionTest.value = 100; trace("----インスタンス"); trace(describeType(functionTest)); trace("----Function"); trace(describeType(functionTest.test)); var f:Function = functionTest.test; trace("----Function呼び出し"); f("value="); }
で、結果
----インスタンス <type name="FunctionTest" base="Object" isDynamic="false" isFinal="false" isStatic="false"> <extendsClass type="Object"/> <variable name="value" type="int"/> <method name="test" declaredBy="FunctionTest" returnType="void"> <parameter index="1" type="String" optional="false"/> <parameter index="2" type="String" optional="true"/> </method> </type> ----Function <type name="builtin.as$0::MethodClosure" base="Function" isDynamic="false" isFinal="true" isStatic="false"> <extendsClass type="Function"/> <extendsClass type="Object"/> <accessor name="prototype" access="readwrite" type="*" declaredBy="builtin.as$0::MethodClosure"/> <accessor name="length" access="readonly" type="int" declaredBy="builtin.as$0::MethodClosure"/> </type> ----Function呼び出し value=100default
これで何が分かるかというと
1.インスタンスをdescribeTypeで調べると、Functionの引数が分かるかどうか
2.Function自体を調べると、Functionの引数が分かるかどうか
3.Function呼び出しがthisポインターを持っているかどうか
ということ。
1に関しては、メソッドの名前、引数(型とデフォルト値があるかどうか)、戻り値などがわかる。
2は期待はずれで、describeTypeがFunctionであるということしか分からない。
3はインスタンスにセットした「100」がちゃんと出力されており、thisポインターが入っていることが分かる。
で、何のためにこれを調べたかというと、
public function execute(f:Function):void{ if( fの第一引数がFunction ){ f(nextExecute); }else{ f(); } } public function nextExecute():void{ }
というコードが書きたかったからだ。
AS3から引数に対するチェックが厳しくなり、Functionの宣言と異なる引数を渡すとエラーになるため、
先にチェックして調整してからFunctionを呼び出したかったのだが、どうもこの様子だと難しいようだ。
インスタンスにFunctionが引っ付いていれば行けるかなと思い、次のようなコードを書いてみたが
public function main(){ var f:Function = functionTest.test; trace(describeType(f["this"])); //無理やりつける var o:Object = new Object(); o.test = f; trace(describeType(o)); }
結果
ReferenceError: Error #1069: builtin.as$0.MethodClosure にプロパティ this が見つからず、デフォルト値もありません。 <type name="Object" isDynamic="true" isFinal="false" isStatic="false"> <method name="hasOwnProperty" declaredBy="Object" returnType="Boolean" uri="http://adobe.com/AS3/2006/builtin"> <parameter index="1" type="*" optional="true"/> </method> <method name="isPrototypeOf" declaredBy="Object" returnType="Boolean" uri="http://adobe.com/AS3/2006/builtin"> <parameter index="1" type="*" optional="true"/> </method> <method name="propertyIsEnumerable" declaredBy="Object" returnType="Boolean" uri="http://adobe.com/AS3/2006/builtin"> <parameter index="1" type="*" optional="true"/> </method> </type>
"this"という変数はなく、エラーになった。Objectの方は、動的につけたメソッドは出てこないようだ。
Function内部にthisに相当するポインタがあることは確実だが、どこを調べてもそれの取り出し方が分からない。
(ためしにfor(var key in f)でもまわしてみたが、プロパティは取れなかった)
さて、どうするか。。。