如何定义可能返回或不返回结果的AS3方法的返回类型?

时间:2011-03-27 05:59:28

标签: actionscript-3 return-type

public function t()
{
  if(xxx)return xxx;
  //don't return anything
}

如何定义此方法的返回类型?

5 个答案:

答案 0 :(得分:3)

一个函数要么不返回任何东西,要么返回一些东西 - 它不能同时做到。原因是,如果你写这段代码怎么办:

var someValue = someFunction();

如果有时候someFunction返回了一个值,有时它会如何处理?

你的问题是一个非常普遍的问题,有几种方法可以解决它。

Sentinel值

您可以返回您视为非值的特殊情况值(例如nullNaN""-1)。这些特殊情况值称为sentinel values。您的函数用户(可能是您自己的代码)会在调用后检查结果。如果它返回一个sentinel值,则不会使用结果。

试用式功能

您还可以使用C#/ .Net中常用的模式,他们称之为“Try-methods”,但您可以调用“Try-functions”。 Actionscript与C#完全不同,但我们可以使这个模式足够接近。

要执行此操作,请返回Boolean,如果您有值,则返回true,否则返回false。然后为函数提供Object参数,并使用实际返回值填充属性:

function trySomeFunction(result:Object) : Boolean
{
    if(xxx)
    {
        result.Value = xxx;
        return true;
    }

    return false;
}

// ...

var result:Object = { Value:null };

if(trySomeFunction(result))
{
    // Do something with the value here
}

<强>例外

如果您的方法未能按预期执行,您可以throw an exception。然后你不必担心返回什么,因为你的代码就死了。

例外情况很好,因为致电您代码的人不必学习。他们不必知道你的函数只有在没有为每个函数返回一些不同的魔法值时才会成功,他们不需要检查你的函数是否返回true / false,并且它们不需要知道当函数成功时,某个属性会在对象上填充。

如果没有例外,如果他们忘记检查您的特殊值或“Try-function”的结果,则程序中可能会发生错误。或者它可能根本不会发生,程序将继续运行,但会被打破。在这些情况下,追踪问题要困难得多。

除了例外情况,您的代码会在检测到问题的第二个代码时爆炸,并为您提供代码行,其中您的程序意识到它无法正常工作。

如果你的功能失败是正常的,那么你可能不应该抛出异常。您可能应该使用“Try-function”或sentinel值。

答案 1 :(得分:1)

Merlyn所说的一切都很好,虽然可能有点矫枉过正。如果你的方法需要返回null的可能性,那么只需传回xxx,无论它是否为空......

public function t():MyReturnType
{
    return xxx;
}

...因为你无论如何都要检查调用方法中的特殊条件:

public function caller():void
{
    var value:MyReturnType = t();
    if (value)
        doSomethingPositive();
    else
        copeWithNullState();
}

有些人认为这是错误的,并且主张在返回类中创建一个特殊的“空值”对象,如下所示:

public class MyReturnType
{
    public static const NULL:MyReturnType = new MyReturnType(null);

    public function MyReturnType(identifier:String)
    ...
}

然后在你的函数中返回一个有趣的MyReturnType或NULL:

public function t():MyReturnType
{
    return xxx || MyReturnType.NULL;
}

但是你没有真正改进你的来电方法,为什么还要费心呢?

public function caller():void
{
    var value:MyReturnType = t();
    if (value != MyReturnType.NULL)
        doSomethingPositive();
    else
        copeWithNullState();
}

无论你选择做什么,最终你只需要在调用者方法中测试特殊情况。就个人而言,我认为最好尽量保持它,并且你班级中特殊的“空值”过于复杂。

答案 2 :(得分:1)

我编写了大量可能返回对象引用的函数,但也可能返回null,如下所示:

public function findThingById( id:int ):MyThingType
{

    ... code here to search for/load/lookup thing with matching id

    if (found)
    {
       return thing;
    }

    return null;
}

无论何时调用可能返回null的函数,您都要显式地测试null的返回值,或者如果您希望null,则不要对返回值执行任何操作。对于内置数据类型,您将使用特殊值而不是null(如上面所示的数字的NaN),但原理是相同的。

答案 3 :(得分:0)

public function t():type
{
  if(xxx)return xxx;
  //don't return anything
}

如下所示:

private function derp():void{

}

private function derp2():int{

}

private function derp3():Boolean{

}

定义返回类型总是很好的做法,如果为false则返回指示符变量(即返回-1表示数字),但如果真的有必要,可以这样做:

public function t()
{
  if(xxx)return xxx;
  //don't return anything
}

根本不指定返回类型,它将返回xxx或未定义,但我强烈建议使用返回类型。

但是由于flash在虚拟内存上运行,它基本上可以适应你的返回类型,所以它使它变得有点灵活,所以你可以返回任何东西。

修改

public function t()
{
  if(true){
    return xxx;   //xxx can by of any type
  }
  return NaN
}

修改

所以假设你想要一个返回类型为int的条件

public function t():int
{
  if(true){
    return xxx;   //where xxx != -1
  }
  return -1
}

当我们找回除了负数1之外的任何数字时,我们知道条件为真,但如果我们得到-1则条件为假。但如果您的数字是任何实数,请使用NaN关键字:

public function t():Number
{
  if(true){
    return xxx;   //where xxx != -1
  }
  return NaN
}

这样一来,如果你回NaN就意味着你的状况是假的

我还应该提一下,当您与NaN打交道时,使用isNaN()来确定返回类型是否为NaN:

示例:

if(isNaN(t()) == true){
    //if condition in function t() was false;
}

答案 4 :(得分:0)

单个函数无法返回void以及返回类型。这是因为void不是任何继承链的一部分,它是一个顶级概念,意味着非常具体的东西;它不会返回任何东西。

不要在nullvoidundefinedvoidNaNvoid之间感到困惑。它们是不同的概念。

你的问题的答案很简单,它不能也不应该这样做。当你遇到这样的问题时,最好退一步问'为什么'你需要这样做。

我强烈建议您将此问题标记为已关闭,而是发布更高级别的问题。例如,

  

如何构建一个具有变量xxx的类来执行此操作,并在用户单击时最终设置为数字。但是如果用户从不点击,那么它将被取消....... ecetera ecetera ....

如果你100%确信你应该做一些像你要求的事情,你可以通过

来“假装”它。
function f():* {
    var xxx:Number = 999;

    if(xxx) {
        return xxx;
    } else {
        return undefined;
    }
}

var xx:* = f();
trace(xx);

但请记住,从那一点开始,每次使用xx时都需要检查它是否undefined。否则会导致错误。