0

如果我声明这样的函数:

public function foo():void
{
    // do something
}

有时在该功能中,我可能会决定提前退出,通常带有日志消息,如下所示:

public function foo():void
{
    if( somethingWentWrong )
    {
        log( "blah blah" );
        return;
    }

    // do something
}

wherelog()本质上是trace()带有签名的包装器public function log( msg:String ):void

为了节省一点空间,我可能会重写该检查并提前为此:

public function foo():void
{
    if( somethingWentWrong )
        return log( "blah blah" );

    // do something
}

这在 99% 的情况下编译和运行都没有问题,除了偶尔(当项目的另一个不相关部分存在错误,或者我进行清理时),我会收到以下形式的编译错误:

"Error: Return value must be undefined"

而且我需要以长格式重新编写它才能编译。编译完成后,我可以将其返回到其简短版本,一切都会再次变得愉快。

然而,当这个错误发生时,它很烦人,我不喜欢在引入 3 行冗余时重写代码。关于它为什么会发生(并且只是偶尔发生)以及我如何才能阻止它而不是到处写长表格的任何想法?从技术上讲,看到log()回报void,应该没有问题。

4

2 回答 2

2

你的函数声明:

public function foo():void

建议你的函数不应该返回任何东西。所以如果我是你,我会做

log( "blah blah" );
return;

代替

return log( "blah blah" );

第二个版本不好,不仅因为它并不总是有效,而且它还会导致代码的任何读者假设它log返回一个值,而实际上它没有。

它使您的代码更难理解。

于 2013-04-10T17:07:23.217 回答
1

如果函数要“返回”一个值,则必须定义类型。

您将函数定义为“void”,但您尝试“返回”一个值。

如果您打算返回一个值,这是编写函数的正确方法:

// if you want to return a value, you must specify the type
public function foo():String
{
    if( somethingWentWrong )
    {
        // I am assuming that log returns a String
        return log( "blah blah" );
    }
        else
        {
            return null;
        }
}

此外,如果您指定返回类型,则函数必须返回一个值。

根据您要执行的操作,您似乎还需要确保您的日志函数返回一个字符串。函数签名应该是:

public function log(msg:String):String

它应该返回一个字符串。

于 2013-04-10T16:13:58.453 回答