2008-12-02 62 views
5

任何想法如何從ActionScript 3中的函數返回多個變量你可以在AS3函數中有「ByRef」參數嗎?

任何像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"} 

回答

3

AS3中的所有內容都是除[u]整數外的參考。概括而言,繼承Object的所有內容都將通過引用賦予函數。

這就是說,我相信你可以做到這一點的唯一方法是使用像ArrayString(「5」和做轉換+數學)的容器類。

6

看來,字符串,整數,單位,布爾值通過Value。 我在Flash嘗試這個小片段,結果均爲陰性:

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

var b:String = "old"; 

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

所以...是字符串被列入黑名單的數據類型嗎?布爾呢? 我的意思是什麼是確定的方式告訴哪些類型通過引用傳遞?

+0

這也是我的問題。我要發送的實際變量(B在這個例子中)我的功能,並獲得由function.http的這種變化://stackoverflow.com/questions/13188723/pass-actual-variable-object-to-a-function – 2012-11-02 03:31:31

+1

清楚的是,對象類型是不相關的,因爲這個主題引用了調用約定。 「ByRef(一個Visual Basic關鍵字):指定一個參數被傳遞,被調用的過程可以改變調用代碼中參數底層的一個變量的值。」 AS3不支持;它總是傳遞參數「ByVal」。將新對象分配給函數中的參數不會導致傳遞給該函數參數的變量指向新對象。通常可以修改對象本身,但傳遞的變量不能在func內修改。 – Triynko 2013-12-12 23:39:00

15

引用一個一派源:

在ActionScript 3.0,所有參數都通過引用傳遞,因爲所有的值被存儲爲對象。但是,屬於基本數據類型(包括布爾值,數字,int,uint和String)的對象具有特殊的運算符,它們的行爲就像按值傳遞一樣。

這導致我查找canonical source

+0

謝謝!很好的答案 - 多年來一直在尋找這個信息。 – 2008-12-09 16:35:30

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] 
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 

點是: 您不能更改引用指向的內容,但可以更改引用指向的數據,只要該引用指向的數據ference是一個對象/數組。

2

這一切都通過值,如果你瞭解C語言編程,你將熟悉指針的概念。

想想指針指向內存中的東西,所有的變量名「鮑勃(BOB =新的人();)」本質上是指針和你一起工作。

現在,當你聲明一個函數,因爲它們都是通過價值

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的指針總是指向「空」和「一個新的Sprite在內存」分別爲,除非它們被修改爲他們的「範圍內的S1和S2 「< - 在嘗試解決此問題之前,請確保您瞭解變量範圍。

和函數中,我們現在有兩個新指針「一」指向「無效」和「B」指向「同一精靈在內存中爲S2」。所以由於對象和數組本質上是指針的集合,並且只有兩個新指針由函數創建,用於使用「a」或「b」的任何屬性/暴露變量「指向內存中數據的指針」仍然與「s1」和「s2」完全一樣,並且是完全相同的指針。

所以當「一」被設置爲「B」,真正的函數內所發生的一切是「一」,現在指針指向同樣的事情爲「B」。但是「s1」和「s2」仍然指向他們之前指出的內容。

!!!! 如果通過參考你不能將「a」和「b」想成新指針,它們本身實際上就是「s1」和「s2」,除非你把它們寫成「a」和「b」 」。

相關問題