2016-11-11 96 views
0

我想通过阅读Scala for the Impatient来学习Scala。这本书开始说要在REPL中输入代码,但这变得乏味,所以我开始将我的代码放在一个文件中,然后通过键入scala myApp.scala从命令行运行它。一切似乎都很好。我决定通过将#!/usr/bin/env scala放在最前面来让我的程序更容易运行,所以我只需从命令行键入./myFile.scala即可。一切都继续良好。为什么Scala程序要有主要方法或扩展App特性?

后来,书上说“每个Scala的程序必须使用对象的main方法开始......”,并给出了一个例子。紧接着,它说:“您可以扩展App特性并将程序代码放入构造函数体中,而不是为您的应用程序提供main方法”,并举例说明。

为什么我会想要做的那些事?

我试图把我的代码中的对象的main方法,它仍然工作,但对象和方法main看似无用的克鲁夫特给我。

我试图把我的代码在扩展App的对象,它没有做任何事情,当我试图直接在命令行中运行它。当我通过scalac运行它然后运行scala MyApp时,它运行良好,但对于我正在开发的小型玩具项目来说,这些看起来像是无用的步骤。

使用main方法生成对象或者扩展为App的对象的目的是什么?

编辑:有人将此问题标记为“scala脚本和应用程序之间的区别”的副本。我想说它可以说不是重复的,因为它是关于具有main方法并从App延伸的,而不是关于“脚本”和“应用程序”这两个词的含义。但是,它非常接近,所以我的问题可能没有必要。我不知道这个问题应该如何处理。随意关闭它,或者在您认为合适的时候将其打开。

回答

4

,如果你正在做的是“小玩具项目”您正在使用的有可能是没有目的。对于较大的项目,main()方法创建与Java的兼容性,并向读者指示您的代码“它开始的位置”。当一个项目很大(数百和数千个文件),并且你第一次接触它时,你可能想知道“我该如何运行?”,“执行从哪里开始?”。 Java从C++中取得了这个约定,C++从C中取得了这个约定.C全部由函数组成,并且您需要告诉编译器需要将哪个函数编译到“开始执行”中。 当你手动执行代码时,你会说“scala myApp.scala”,它向Scala解释器解释执行哪个类。但是,如果你编写一个更大的应用程序,编译两个类并将它们放入一个JAR中,则需要一种方法告诉JVM首先执行的操作:指定一个对象的名称,其中(按照惯例)执行将从main(args: Array[String])开始。

0

您可以使用这两种方法运行程序。但脚本用于小程序,同时声明main方法用于大型程序。传统上运行字节码的JVM会识别main方法,并从主方法的第一行开始执行程序。

2

你的小程序显示结果没有主要方法的原因是因为你实际上没有使用scala编译器。该程序只是使用scala解释器。 所以一个程序,如:

A.scala:

println("just the interpreter") 

将运行并给出结果。但是,试图编译此程序scalac会产生一个错误: A.scala:1: error: expected class or object definition

通常Scala的项目不指令在1个文件列表。只要您开始使用类和对象构建应用程序,就会发现程序不会产生任何结果。

B.scala:

object B { 
    println("won't show up") 
} 

为了让你需要添加一个main方法来告诉斯卡拉在入口点到你的应用程序的结果。

C.scala:

object C { 
    def main(args: Array[String]) = 
     println("shows up") 
} 

为了方便起见在App性状允许用户通过简单地扩展应用打开任何对象成可执行程序。扩展这个特性将整个对象体转换为主要方法。

D.scala:

object D extends App { 
    println("shows up") 
} 

现在你不能简单地调用scala D.scala才能得到结果。您首先需要拨打scalac D.scala,然后您可以拨打scala D,您将得到您预期的结果。

scala C.scala仅适用,因为明确定义的主要对象是由scala解释器处理的特殊情况。

相关问题