Actionscript 3.0(我假設一般使用Javascript和ECMAScript)缺少像int這樣的本機類型的傳遞引用。因此,我發現從一個非常笨重的函數中獲取值。解決這個問題的正常模式是什麼?什麼是最簡單的方法來模擬Actionscript 3.0中的傳遞引用?
例如,是否有一個乾淨的方式來實現swap(intA,intB)在Actionscript?
Actionscript 3.0(我假設一般使用Javascript和ECMAScript)缺少像int這樣的本機類型的傳遞引用。因此,我發現從一個非常笨重的函數中獲取值。解決這個問題的正常模式是什麼?什麼是最簡單的方法來模擬Actionscript 3.0中的傳遞引用?
例如,是否有一個乾淨的方式來實現swap(intA,intB)在Actionscript?
我相信你能做到的最好的是傳遞一個容器對象作爲參數傳遞給函數,改變該對象的一些屬性值:
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:*;
}
然後使用帶有一定數量的引用參數的函數來充當「指針」,如果您確實只是查找「out」參數並將其初始化,並且您的交換將變爲:
function swap(Reference a, Reference b) {
var tmp:* = a.value;
a.value = b.value;
b.value = tmp;
}
而且你總是可以去堅果和定義特定IntReference,StringReference等
你也可以使用一個包裝,而不是爲int:
public class Integer
{
public var value:int;
public function Integer(value:int)
{
this.value = value;
}
}
當然,這將是更有益的,如果你能使用操作符重載...
這是吹毛求疵,但int
,String
,Number
和其他是按引用傳遞,這只是他們是不可改變的。當然,效果與通過價值傳遞一樣。
這很煩人。但是,如果你使用不同的習語而不是例如C#,你可以得到合理質量的結果。如果您需要傳入大量參數,請傳入填充所需數據的對象,並在返回時更改對象的參數。 Object類僅用於這類事情。
如果你只是需要返回一堆數據,返回一個Object。這比ECMAScript風格更符合pass-by-ref語義。
ECMA-262 3規範中沒有定義解構賦值(例如[a,b] = [b,a]),它沒有在JavaScript 1.5中實現,該版本等同於JScript實現的版本IE瀏覽器。我已經在AS4規範預覽中看到了這個語法,我相信它是JavaScript 1.7的一部分。
只看一些Java代碼。 Java有一個慣例,即引用類型是通過引用傳遞的,而基本類型是從值開始傳遞的。這在很多方面都是非常好的模式。
可是談到交換,做在的Java/AS3交換的最好和最簡單的方法是使用下面三行:
var temp:int = array[i]; array[j] = array[i]; array[i] = temp;
即使世界沒有真正任何理由使用的功能做一個簡單的交換,只要3條線就可以更快速地完成。
hasseg中不起作用,我支持希望有人知道更優雅的技巧,但看起來您的答案似乎是最好的。我認爲自然的後續行動是:這個限制是否會讓其他人瘋狂,還是僅僅是我? :) – 2008-09-08 23:48:44