你能在AS3函数中使用“ByRef”参数吗?

时间:2008-12-02 22:02:49

标签: actionscript-3 byref args

知道如何从ActionScript 3中的函数返回多个变量吗?

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

6 个答案:

答案 0 :(得分:15)

引用Google搜索来源:

  

在ActionScript 3.0中,所有参数都通过引用传递,因为所有值都存储为对象。但是,属于原始数据类型的对象(包括Boolean,Number,int,uint和String)具有特殊的运算符,使它们的行为就像它们按值传递一样。

这导致我查找canonical source

答案 1 :(得分:6)

似乎字符串,整数,单位,布尔值都按值传递。 我在Flash中尝试了这个小片段,结果是否定的:

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

var b:String = "old";

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

那么...... String也是列入黑名单的数据类型吗?布尔也呢? 我的意思是什么是确定的方式哪些类型通过引用传递?

答案 2 :(得分:3)

除了[u]整数之外,AS3中的所有内容都是参考。为了概括,继承Object的所有内容都将通过引用赋予函数。

话虽这么说,我相信你能做到的唯一方法是使用容器类,如ArrayString(“5”并进行转换+数学运算)。

答案 3 :(得分: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]

答案 4 :(得分:2)

一切都是有价值的,如果你理解C编程,你就会熟悉指针的概念。

将指针视为指向内存中的某个内容,并且所有变量名称“bob from(bob = new person();)”基本上都是您使用的指针。

现在,当您声明一个函数时,因为它们都是按值

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指针总是分别指向“null”和“内存中的新Sprite”,除非它们在“Scope”中被修改为s1和s2< - 请确保你之前了解变量范围甚至试图解决这个问题。

在函数中,我们现在有两个新指针“a”指向“null”,“b”指向“内存中与s2相同的sprite”。因为对象和数组本质上是指针的集合,并且函数只创建了两个新指针,用于使用“a”和“b”任何属性/暴露变量“指向内存中数据的指针”的“a”或“b”仍将与“s1”和“s2”完全相同,并且是完全相同的指针。

因此,当“a”被设置为“b”时,在函数内,真正发生的是“a”指针现在指向与“b”相同的东西。但是“s1”和“s2”仍然指向他们之前指出的内容。

!!!! 如果这是通过引用你将无法将“a”和“b”视为新指针,它们实际上将是“s1”和“s2”本身,除非你把它们写成“a”和“b”

答案 5 :(得分: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

点存在: 您无法更改引用所指向的内容,但您可以更改引用所指向的数据,只要该引用是对象/数组。