“ ByRef” AS3関数の引数?
-
22-07-2019 - |
質問
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"}
解決
AS3のすべては、[u] ints以外の参照です。一般化するには、 Object
を継承するすべてのものが参照によって関数に渡されます。
そうは言っても、できると信じる唯一の方法は、 Array
や String
(" 5"などのコンテナークラスを使用して変換を行うことです+ math)。
他のヒント
googledソースの引用:
ActionScript 3.0では、すべての値はオブジェクトとして保存されるため、すべての引数は参照によって渡されます。ただし、Boolean、Number、int、uint、Stringなどのプリミティブデータ型に属するオブジェクトには、値で渡されたかのように動作する特別な演算子があります。
標準ソースを検索するようになりました。
文字列、整数、単位、ブール値は値によって渡されるようです。 Flashでこの小さなスニペットを試してみましたが、結果は否定的でした:
function func(a:String){
a="newVal";
}
var b:String = "old";
trace(b) // old
func(b);
trace(b) // old
それで...文字列もブラックリストに登録されたデータ型ですか?ブール値も? 参照によって渡される型は確かにわかりますという意味ですか?
すべての価値があります。Cプログラミングを理解していれば、ポインタの概念に精通しています。
ポインタがメモリ内の何かを指していると考えてください。また、すべての変数名" bob from(bob = new person();)"基本的には、使用するポインターです。
今、関数を宣言するとき、それらはすべて値によるものであるため
function Test(a:Object, b:Object):void {
a = b;
}
" a"の両方について考えることができます。および「b」新しいポインタであるため、「テスト」内でのみ関数は両方の「a」を行います;および「b」存在し、メモリ内の何かを指します。
では、使用しましょう
var s1:Sprite = null;
var s2:Sprite = new Sprite;
Test(s1,s2);
したがって、s1およびs2ポインターは常に「null」を指します。および「メモリ内の新しいスプライト」それぞれ、「スコープ」内でs1およびs2として変更されない限り、 <-これに取り組む前に、変数スコープを理解してください。
そして、関数内に2つの新しいポインター" a"が追加されました。 「null」を指すおよび「b」 「メモリ内のs2と同じスプライト」を指します。したがって、オブジェクトと配列は本質的にポインタのコレクションであり、「a」を使用するために関数によって作成された新しいポインタは2つだけです。および「b」プロパティ/公開変数"メモリ内のデータへのポインタ" 「a」のまたは" b"まだ「s1」の場合とまったく同じになります。および「s2」とは、まったく同じポインターです。
したがって、関数内で" a" " b"に設定されますが、実際に起こるのは" a"ポインターは、「b」と同じものを指すようになりました。しかし、「s1」はおよび「s2」まだ彼らが前に指していたものを指している。
!!!! これが参照によるものである場合、「a」を考えることはできません。および「b」新しいポインターとして、実際には「s1」になります。および「s2」ただし、「a」として書き出す場合を除きます。および" b"。
Wrong Wrong Wrong and Wrong ..すべての引数は値で渡されます!!! 渡されたオブジェクト内のプロパティを変更できるということは、オブジェクト自体を変更できるという意味ではありません。次のコードを試してください
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]
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
ポイントビーイング: 参照が指しているものを変更することはできませんが、参照がオブジェクト/配列である限り、参照が指しているデータを変更することができます。