【问题标题】:why main() return value does not set exitcode in dart?为什么 main() 返回值没有在 dart 中设置 exitcode?
【发布时间】:2014-11-17 15:52:58
【问题描述】:

Dart 应该是务实的、直观的等。 我想知道如果返回 int,为什么顶级 main() 不设置退出代码?

我知道,您可以通过dart:io.exitCode=dart:io.exit() 进行设置。

问题是为什么语言设计者决定放弃这种流行的惯例

#!/path/to/dart --checked
int main() {
  int myExitCode = 5;
  return myExitCode;
}

它返回 0(如 documentation 中所述),但在命令行世界中它只是愚蠢的。 它甚至不会警告您(编译器检查模式,dartanalyzer)。脚本只是默默地返回 0。它背后有什么理由吗?

更新:

提案错误:https://code.google.com/p/dart/issues/detail?id=21639

【问题讨论】:

    标签: dart


    【解决方案1】:

    Dart 中的 main() 方法总是返回 void,即使你另有说明。请参阅The main() function 正如 John Evans 的回答中提到的,如果要返回值,则必须使用 exit 函数。这是因为 Dart VM 在 CLI 和浏览器中都运行。就浏览器而言,从 main() 提供返回值是没有意义的。因此,该功能仅限于 dart:io 库,它只能在 dart VM 的 CLI 版本中运行。

    【讨论】:

    • 我知道文档中关于 main() 的内容。再一次,问题是为什么会有这种行为?为什么不至少警告?这是误导。
    • 同意。应该有一个警告,或者至少在编辑器中提示 main 返回类型必须为 void(如果提供的话),并且在 main 中的 return 语句上提供除 null 以外的任何内容的警告/提示。我建议在dartbug.com 提交错误
    【解决方案2】:

    可能的答案是 main() 的返回值在浏览器中没有意义(正如马特 B 指出的那样,+1),所以 dart 根本不允许这样做。

    但这是不连贯的,因为获取命令行参数列表main(List<String> args) 在浏览器环境中也没有意义,并且 dart 语言支持main(List<String> args)

    另一方面,对 main-return-sets-exitCode 功能的支持会紧紧抓住 dart 的核心 (如何处理顶级 main() )到dart:io,这在浏览器中不可用。 但是,我个人认为问题代码中显示的这种连线和意外行为不会那么糟糕。

    【讨论】:

      【解决方案3】:

      我对此的理解是,虽然main() 可能会完成执行,但您可能还有其他尚未完成的异步工作正在进行。您可以使用 dart:io 库中的 exit 立即返回退出代码。

      import 'dart:io';
      
       main(){
          exit(42);
       }
      

      API 文档中有关退出的更多信息:https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:io#id_exit

      【讨论】:

      • 我知道。我只是希望 dart 调用 dart:io.exitCode=,如果它是 int,则 main 返回的值。
      猜你喜欢
      • 1970-01-01
      • 2014-08-06
      • 2011-04-13
      • 1970-01-01
      • 2020-11-08
      • 2020-07-04
      • 2016-02-24
      相关资源
      最近更新 更多