2008-12-02 44 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” ”。