0

以下のコードのように、単一の文字列をパラメーターとして受け取る Red5 サービス関数と、パラメーターをとらない別の関数があります。

public class AService
{
   private String someName;

   public void setName(String aName)
   {
       someName = aName;
   }
   .
   .
   public String makeMessage()
   {
       return("Hello, "+someName);
   }
   .
   .
   other functions
}

動的パラメーターを使用して、サービス関数を呼び出す ActionScript 関数もあります。

public class Connector
{
   private var netConn: NetConnection;

   public function invokeCall(theFunc:String,...theParams): void
   {
      var resp:Responder = new Responder(checkResult);
      netConn.call(theFunc,resp,theParams);
   }
   .
   .
}

「...theParams」が実際にはパラメーター オブジェクトの配列であることは承知しています。また、NetConnector クラスの call() メソッドがそのパラメータ オブジェクト配列を使用していることも知っています。残念ながら、サービスの makeMessage() メソッドで (パラメーターを入れずに) invokeCall() を実行すると、次のようになります。

invokeCall("AService.makeMethod");

Red5 から関数が存在しないというメッセージが表示されます。私がそれを機能させる唯一の方法は、パラメーター付きとパラメーターなしの 2 つの呼び出しメソッドを作成し、その関数をパラメーターなしで呼び出すことです。

さらに、次のように setName() 関数を呼び出します。

invokeCallwithPrams("AService.setName","factor3");

サービス関数の署名を変更しない限り、動作しないようです:

public class AService
{
   private String someName;

   public void setName(String[] aName)
   {
       someName = aName[0];
   }
   .
   .
   public String makeMessage()
   {
       return("Hello, "+someName);
   }
   .
   .
   other functions
}

これは気にしません (Red5 のドキュメントでは、パラメーターを配列として扱う必要はないことが示されていますが)、文字列 "factor3" を NetConnection クラスの call() メソッドに渡すと、どういうわけかsetName() では "[factor3]" になります!

明らかに、ここで何かがおかしいのですが、私はそれを理解することができませんでした.

Red5 バージョン 1.0.1 を使用しており、Actionscript はバージョン 3 です。

何が起こっているのか、そして(さらに重要なことに)これを修正する方法を誰かに説明してもらえますか???

もしよろしければアドバイスを...

更新: 奇妙さは続く

NetConnection クラスの call() メソッドのセットアップと呼び出しに使用した関数のパラメーターを変更するテストを行いました。「...theParams」を渡す代わりに、次のように theParams:String に変更しました。

   public function invokeCall(theFunc:String,theParams:String): void
   {
      var resp:Responder = new Responder(checkResult);
      netConn.call(theFunc,resp,theParams);
   }

興味深いことに、サービス メソッド setName() に表示されていた括弧がなくなりました。

この問題が何であれ、それは Actionscript の動的パラメーターと関係があります。私は、別のメソッドからメソッドに渡される動的パラメーターを適切に処理できないというバグを Actionscript 3 で発見したのではないかと考えています。

他の誰かがこの問題を見たことがありますか? 解決策はありますか?動的パラメーターは、誰でも必要に応じてパラメーターを追加し、必要なオブジェクトにすることができるようになっています。残念ながら、別のメソッドから渡された動的パラメーターを台無しにすることなく使用できるようには見えません。

これは、Actionscript の重大なバグのようです。私は正しいですか?

誰かアドバイスください...

4

1 に答える 1

0

I found the solution. It is not a bug in Actionscript, it is a bit of strangeness in the language.

The basic information about the solution can be found here:

AS3 variable length argument expand to call another function with var length args

Based on what is there, I needed to do the following in the method I am using for invokeCallwithParams:

.
.
var conn:Connector = new Connector();

private function invokeCaller(fName:String,...cParams)
{
   cParams.unshift(fName);
   conn.invokeCall.apply(conn,cParams);
}

This eliminates the unnecessary brackets passed into my setName() service function, meaning that I can pass dynamic, variable length parameters from one method to another...

于 2013-05-15T18:19:47.750 に答える