Actionscript 3.0(そして私は一般的にJavascriptとECMAScriptを想定しています)には、intのようなネイティブタイプの参照渡しがありません。その結果、関数から値を取得するのは非常に不格好です。これを回避するための通常のパターンは何ですか?
たとえば、Actionscriptでswap(intA、intB)を実装するクリーンな方法はありますか?
Actionscript 3.0(そして私は一般的にJavascriptとECMAScriptを想定しています)には、intのようなネイティブタイプの参照渡しがありません。その結果、関数から値を取得するのは非常に不格好です。これを回避するための通常のパターンは何ですか?
たとえば、Actionscriptでswap(intA、intB)を実装するクリーンな方法はありますか?
あなたができる最善のことは、コンテナオブジェクトを引数として関数に渡し、そのオブジェクトのいくつかのプロパティの値を変更することだと思います:
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);
私は別の方法がこの種のものを定義するどこかにあると思います...
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などを定義することができます。
これはつまらないことですがint
、 、String
、Number
およびその他は参照によって渡されます。それは、それらが不変であるということだけです。もちろん、効果は値渡しと同じです。
intの代わりにラッパーを使用することもできます。
public class Integer
{
public var value:int;
public function Integer(value:int)
{
this.value = value;
}
}
もちろん、これは演算子のオーバーロードを使用できる場合に便利です...
それは迷惑です。ただし、C# などとは異なるイディオムを使用すると、妥当な品質の結果を得ることができます。多くのパラメーターをやり取りする必要がある場合は、必要なデータで満たされたオブジェクトを渡し、戻ったときにオブジェクトのパラメーターを変更します。Object クラスはまさにこの種のもののためのものです。
大量のデータを返すだけの場合は、オブジェクトを返します。これは、参照渡しのセマンティクスよりも ECMAScript スタイルに準拠しています。
構造化代入 ([a,b] = [b,a] など) は ECMA-262 3 仕様では定義されておらず、IE の JScript 実装と同等のバージョンである JavaScript 1.5 では実装されていません。この構文は AS4 仕様のプレビューで見たことがありますが、これは JavaScript 1.7 の一部だと思います。
ActionScriptがJavascriptのように機能する場合、
[a,b] = [b,a]