13

Actionscript 3.0(そして私は一般的にJavascriptとECMAScriptを想定しています)には、intのようなネイティブタイプの参照渡しがありません。その結果、関数から値を取得するのは非常に不格好です。これを回避するための通常のパターンは何ですか?

たとえば、Actionscriptでswap(intA、intB)を実装するクリーンな方法はありますか?

4

8 に答える 8

7

あなたができる最善のことは、コンテナオブジェクトを引数として関数に渡し、そのオブジェクトのいくつかのプロパティの値を変更することだと思います:

function swapAB(aValuesContainer:Object):void
{
    if (!(aValuesContainer.hasOwnProperty("a") && aValuesContainer.hasOwnProperty("b")))
        throw new ArgumentError("aValuesContainer must have properties a and b");

    var tempValue:int = aValuesContainer["a"];
    aValuesContainer["a"] = aValuesContainer["b"];
    aValuesContainer["b"] = tempValue;
}
var ints:Object = {a:13, b:25};
swapAB(ints);
于 2008-09-08T21:38:45.817 に答える
4

私は別の方法がこの種のものを定義するどこかにあると思います...

public class Reference {
    public var value:*;
}

次に、実際に「出力」パラメータを探しているだけで、途中で初期化するかどうかにかかわらず、いくつかの参照引数を使用して「ポインタ」として機能する関数を使用すると、スワップは次のようになります。

function swap(Reference a, Reference b) {
    var tmp:* = a.value;
    a.value = b.value;
    b.value = tmp;
}

そして、いつでも気を抜いて、特定のIntReference、StringReferenceなどを定義することができます。

于 2008-09-09T00:01:54.663 に答える
4

これはつまらないことですがint、 、StringNumberおよびその他参照によって渡されます。それは、それらが不変であるということだけです。もちろん、効果は値渡しと同じです。

于 2008-09-09T06:57:37.033 に答える
3

intの代わりにラッパーを使用することもできます。

public class Integer
{
    public var value:int;

    public function Integer(value:int)
    {
        this.value = value;
    }
}

もちろん、これは演算子のオーバーロードを使用できる場合に便利です...

于 2008-09-09T00:02:21.697 に答える
1

それは迷惑です。ただし、C# などとは異なるイディオムを使用すると、妥当な品質の結果を得ることができます。多くのパラメーターをやり取りする必要がある場合は、必要なデータで満たされたオブジェクトを渡し、戻ったときにオブジェクトのパラメーターを変更します。Object クラスはまさにこの種のもののためのものです。

大量のデータを返すだけの場合は、オブジェクトを返します。これは、参照渡しのセマンティクスよりも ECMAScript スタイルに準拠しています。

于 2009-03-18T07:18:12.337 に答える
0

構造化代入 ([a,b] = [b,a] など) は ECMA-262 3 仕様では定義されておらず、IE の JScript 実装と同等のバージョンである JavaScript 1.5 では実装されていません。この構文は AS4 仕様のプレビューで見たことがありますが、これは JavaScript 1.7 の一部だと思います。

于 2009-08-21T17:03:26.007 に答える
-2

ActionScriptがJavascriptのように機能する場合、

[a,b] = [b,a]
于 2008-09-08T03:09:35.390 に答える