2011-11-09 19 views
3

我是Actionscript编程新手。我试图找出什么是从函数返回多个变量的最佳方法,每个变量都有不同的数据类型。例如,如果函数需要返回变量aa(一个字符串)和变量bb(一个数字)。推荐的方法从数学运算AS3函数中返回多个变量?

我正在使用的函数只是计算大量数学,并不涉及GUI中的对象。我从Google搜索中获得的一种方法使用了Object,但是(我认为)这需要我创建一个类,我想知道是否有更简单的方法。由于数组可以保存不同数据类型的元素,所以这可能是一种更简单的方法(?)。

下面是David Gassner的“Flash Builder 4和Flex 4 Bible”中的mxml和AS3文件示例。

文件:Calculator.mxml

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:components="components.*"> 
    <fx:Script source="calculator.as"/> 
    <s:Panel title="Calculator" horizontalCenter="0" top="20"> 
    <s:layout> 
     <s:VerticalLayout horizontalAlign="center"/> 
    </s:layout> 
    <mx:Form> 
     <components:ButtonTile id="input" 
     select="selectHandler(event)" 
     calculate="calculateHandler(event)"/> 
     <mx:FormItem label="Entry:"> 
     <s:TextInput text="{currentInput}" editable="false" width="80"/> 
     </mx:FormItem> 
     <mx:FormItem label="Total:"> 
     <s:TextInput text="{currentResult}" editable="false" width="80"/> 
     </mx:FormItem> 
    </mx:Form> 

文件:calculator.as

//ActionScript code for Calculator.mxml 
[Bindable] 
private var currentResult:Number=0; 
[Bindable] 
private var currentInput:String=""; 

private function calculateHandler(event:Event):void 
{ 
    currentResult += Number(currentInput); 
    currentInput=""; 
} 
private function selectHandler(event:TextEvent):void 
{ 
    currentInput += event.text; 
} 

可能有人说明如何修改的calculator.as的功能之一,正如一个例子如何返回两个值,其中一个是数字,另一个是字符串?有没有一种明显的方法可以做到这一点,或者,不同方法的优缺点是什么?提前致谢!

回答

8

你可以很简单地返回一个Object这是dynamic,从而使您可以快速定义值,如:

return {something: "string", another: 18}; 

或者:

var obj:Object = {}; 

obj.something = "string"; 
obj.another = 18; 

return obj; 

但在我看来这是PRA真是可怜ctice(特别是如果你的功能是用新值返回相同的信息集)。

我会走这条路:

您可以创建自己的类,用于保存各种属性。从那里你可以返回这个对象的一个​​实例,其中包含你想要的属性。

举例:
这将是在一个名为CollisionData.as

package 
{ 
    public class CollisionData 
    { 
     public var x:Number = 0;  // X coordinate of the collision 
     public var y:Number = 0;  // Y coordinate of the collision 
     public var angle:Number = 0; // Collision angle 
    } 
} 

外部文件和你的功能可能是:

function calculate():CollisionData 
{ 
    var col:CollisionData = new CollisionData(); 

    // determine collision details 
    col.x = 115; 
    col.y = 62; 
    col.angle = 0.345; 

    return col; 
} 

然后你就可以创建自己的碰撞数据基于关闭的结果:

var myCollision:CollisionData = calculate(); 

并获取详细信息:

trace(
    myCollision.x, 
    myCollision.y, 
    myCollision.angle 
); 
+0

谢谢马蒂!关于你最后的建议,你能帮我通过显示.as文件中的哪些代码片段以及哪些代码放在.mxml文件中来消化示例的各个部分吗?完成的两个文件会是什么样子? (仍然缺少如何将所有内容放在一起的大图) – ggkmath

+1

请参阅编辑如何将'CollisionData'放入它自己的文件中。解决这个问题的最简单方法是每个'class'都需要它自己的外部.as文件。 – Marty

+0

ggkmath:如果你真的需要关闭很多数字,你可以避免在每次调用时创建对象。使用静态对象来返回数据 - 但是在下次调用之前必须从数据中提取数据。减少内存抖动 - >执行速度快得多。 – alxx

2

无需创建类,这应该为你工作:

public function calculate():Object 
{ 
    return {valueA: "string", valueB: 1}; 
} 
+0

+1但是我会为返回的对象创建一个类。 – Marty

+0

当然,类会更清楚地说明这个返回对象代表什么以及如何处理它 –

+0

这会比创建类和对象更快吗? – ggkmath