5

知道如何从 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"}
4

6 回答 6

15

引用谷歌来源:

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

这导致我查找规范来源

于 2008-12-03T19:49:45.830 回答
6

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

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

var b:String = "old";

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

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

于 2008-12-03T09:57:36.337 回答
3

除了 [u]ints,AS3 中的所有内容都是引用。概括地说,继承的所有内容都Object将通过引用提供给函数。

话虽如此,我相信你能做到的唯一方法是使用容器类,如 anArray或 a String(“5”并进行转换+数学)。

于 2008-12-02T22:28:46.103 回答
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]
于 2009-03-26T08:55:33.213 回答
2

这都是值,如果您了解 C 编程,您将熟悉指针的概念。

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

现在,当你声明一个函数时,因为它们都是 By Value

function Test(a:Object, b:Object):void {
   a = b;
}

您可以认为“a”和“b”都是新指针,因此只有在“Test”函数中“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 相同的精灵”。所以由于对象和数组本质上是指针的集合,并且函数只创建了两个新指针以供使用“a”和“b”任何属性/公开变量“指向内存中数据的指针”“a”或“b”仍然与“s1”和“s2”的指针完全相同,并且是完全相同的指针。

所以在函数中,当“a”被设置为“b”时,实际上所发生的只是“a”指针现在指向与“b”相同的东西。但是“s1”和“s2”仍然指向它们之前指向的东西。

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

于 2010-07-12T22:25:12.810 回答
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

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

于 2009-10-07T06:29:58.987 回答