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

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

4

5 回答 5

3

一个函数要么什么都不返回,要么返回一些东西——它不能两者都做。原因是,如果您编写以下代码会怎样:

var someValue = someFunction();

someFunction如果有时返回值,有时不返回值,如何处理此代码?

但是,您的问题是一个非常常见的问题,并且有几种方法可以解决它。

哨兵价值观

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

尝试风格的函数

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

为此,请 return Booleantrue如果您有值则返回,如果没有则返回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
}

例外

如果你的方法没有按照它承诺的去做,你可以抛出一个异常。然后你不必担心返回什么,因为你的代码会死掉。

例外很好,因为调用您的代码的人不必学习太多。他们不必知道你的函数只有在它没有返回每个函数都不同的魔法值时才成功,他们不需要检查你的函数是否返回真/假,也不需要知道当函数成功时某些属性会填充到对象上。

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

除了例外情况,您的代码在检测到问题的那一刻就会崩溃,并为您提供程序意识到它无法正常工作的代码行。

但是,如果您的函数失败是正常且可以接受的,那么您可能不应该抛出异常。您可能应该改用“Try-function”或哨兵值。

于 2011-03-27T06:44:54.223 回答
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),但原理是相同的。

于 2011-03-29T04:10:04.637 回答
1

Merlyn 所说的一切都很好,尽管可能有点矫枉过正。如果您的方法需要返回 null 的潜力,那么只需将 xxx 传回,无论它是否为 null ......

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();
}

无论您选择做什么,最终您都将不得不在调用者方法中测试特殊情况。就我个人而言,我会说最好让它尽可能简单,并且你的类中特殊的“空值”过于复杂。

于 2011-03-27T08:25:25.467 回答
0

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

不要混淆nulland void, undefinedand void, NaNand void。它们是不同的概念。

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

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

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

如果你 100% 确信你应该按照你的要求去做,你可以通过以下方式“伪造”它

function f():* {
    var xxx:Number = 999;

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

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

但是请记住,从那时起,您将需要在每次使用 xx 时检查它是否undefined。否则会导致错误。

于 2011-03-27T07:35:49.007 回答
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{

}

ETC

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

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

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

但是由于闪存在虚拟内存上运行,它基本上可以适应您的返回类型,因此它有点灵活,因此您可以返回任何内容。

编辑:

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;
}
于 2011-03-27T06:00:46.320 回答