5

ActionScript 3 の関数から複数の変数を返す方法はありますか?

入力引数の変数を変更できる VB.NET のようなもの (ByRef 引数) はありますか?

Sub do (ByRef inout As Integer)
 inout *= 5;
End Sub

Dim num As Integer = 10
Debug.WriteLine (num)        '10
do (num)
Debug.WriteLine (num)        '50

連想配列を返す以外に何かありますか?

return {a:"string 1", b:"string 2"}
4

6 に答える 6

15

グーグルソースを引用:

ActionScript 3.0 では、すべての値がオブジェクトとして格納されるため、すべての引数が参照によって渡されます。ただし、Boolean、Number、int、uint、String などのプリミティブ データ型に属するオブジェクトには、値で渡されたかのように動作させる特別な演算子があります。

これにより、正規のソースを検索するようになりました。

于 2008-12-03T19:49:45.830 に答える
6

文字列、整数、単位、ブール値が値によって渡されるようです。 この小さなスニペットを Flash で試してみましたが、結果は否定的でした:

function func(a:String){
    a="newVal";
}

var b:String = "old";

trace(b)    //  old
func(b);
trace(b)    //  old

それで... String もブラックリストに登録されたデータ型ですか? ブールも?つまり、どの型が参照渡しされているかを確実に知る方法は何ですか?

于 2008-12-03T09:57:36.337 に答える
3

AS3のすべては、[u]ints以外のリファレンスです。一般化すると、継承Objectするものはすべて参照によって関数に与えられます。

そうは言っても、あなたがそれを行うことができると私が信じる唯一の方法は、ArrayまたはString( "5"のようなコンテナクラスを使用し、変換+数学を行うことです)。

于 2008-12-02T22:28:46.103 に答える
2

それはすべて値によるものです.Cプログラミングを理解していれば、ポインターの概念に精通しているでしょう.

ポインターはメモリ内の何かを指していると考えてください。すべての変数名 "bob from (bob = new person();)" は、基本的に操作するポインターです。

さて、関数を宣言するとき、それらはすべて値渡しであるため

function Test(a:Object, b:Object):void {
   a = b;
}

「a」と「b」の両方が新しいポインターであると考えることができるため、「Test」関数内でのみ「a」と「b」の両方が存在し、メモリ内の何かを指します。

それでは使ってみましょう

var s1:Sprite = null;
var s2:Sprite = new Sprite;
Test(s1,s2);

したがって、s1 および s2 ポインタは、「スコープ」内で s1 および s2 として変更されない限り、常に「null」および「メモリ内の新しいスプライト」をそれぞれ指します <- 取り組む前に、変数のスコープを理解していることを確認してくださいこれ。

関数内には、「null」を指す「a」と「s2 と同じメモリ内のスプライト」を指す「b」という 2 つの新しいポインターがあります。オブジェクトと配列は基本的にポインターのコレクションであり、「a」と「b」を使用するために関数によって作成された新しいポインターは2つだけなので、「a」または「b」のプロパティ/公開変数「メモリ内のデータへのポインター」 "s1" および "s2" のものとまったく同じであり、まったく同じポインターです。

そのため、関数内で "a" が "b" に設定されると、実際には "a" ポインターが "b" と同じものを指しているだけです。ただし、「s1」と「s2」は、以前に指していたものを指しています。

!!!! これが参照によるものである場合、「a」と「b」を新しいポインターと考えることができず、「a」と「b」として書き出さない限り、実際には「s1」と「s2」自体になります。 .

于 2010-07-12T22:25:12.810 に答える
2

間違って間違って間違って..すべての引数は値によって渡されます!!! 渡されたオブジェクト内のプロパティを変更できるという事実は、オブジェクト自体を変更できるという意味ではありません。次のコードを試してください

function Test(a:Object, b:Object):void {
   a = b;
}

function Test2():void {
   var s1:Sprite = null;
   var s2:Sprite = new Sprite;

   Test(s1,s2);
   Trace(s1);
   Trace(s2);
}

トレース結果は次のとおりです。

null
[object Sprite]
于 2009-03-26T08:55:33.213 に答える
0

DarthZorG の例と Flash ドキュメントのこの例の微妙な違いに注意してください。

function passByRef(objParam:Object):void 
{ 
    objParam.x++; 
    objParam.y++; 
    trace(objParam.x, objParam.y); 
} 
var objVar:Object = {x:10, y:15}; 
trace(objVar.x, objVar.y); // 10 15 
passByRef(objVar); // 11 16 
trace(objVar.x, objVar.y); // 11 16

Point Being: 参照が指している対象を変更することはできませんが、その参照がオブジェクト/配列である限り、参照が指しているデータを変更することはできます。

于 2009-10-07T06:29:58.987 に答える