如何将args传递给此scala对象?

时间:2018-06-04 15:02:57

标签: scala

我试图找出如何将args传递给此scala对象:

我在这个sbt项目路径中编写了这个类:allaboutscala/src/main/scala/gzip_practice/gzipwriter

package gzip_practice

import java.io._
import java.util.zip._

/** Gzcat
    */
object gzcat extends App {
    private val buf = new Array[Byte](1024)

    try {
        for (path <- args) {
            try {
                var in = new GZIPInputStream(new FileInputStream(path))
                var n = in.read(buf)
                while (n >= 0) {
                    System.out.write(buf, 0, n)
                    n = in.read(buf)
                }
            }
            catch {
                case _:FileNotFoundException =>
                    System.err.printf("File Not Found: %s", path)
                case _:SecurityException =>
                    System.err.printf("Permission Denied: %s", path)
            }
        }
    }
    finally {
        System.out.flush
    }
}

这是一个名为allaboutscala的sbt项目。我试图运行它: scala src/main/scala/gzip_practice/gzipwriter.scala "hi"但命令只是挂起而且我不知道为什么。

我应该如何使用args运行此对象构造函数?

3 个答案:

答案 0 :(得分:1)

您可以使用scala命令作为脚本运行器。

通常,它会将您的“脚本”代码包装在main方法中。

但是如果你有一个带有main方法的对象,比如你的App,它会将它用作入口点。

但是,它不喜欢脚本中的package语句。

如果您注释掉package语句,则可以编译并运行:

scala -nc somefile.scala myarg.gz

-nc表示“没有编译守护进程”;否则,它将启动第二个进程来编译脚本,以便后续编译更快;但这是一个脆弱的工作流程,我不推荐它。 我确认您的代码有效。

通常,人们使用sbt或IDE在jar中编译和打包以与scala myapp.jar一起运行。

答案 1 :(得分:0)

object是类的静态实例。您可以使用以下方法构建它:

object gzcat(args: String*) extends App {
  ...
}

args绑定为对象val中的gzcat

答案 2 :(得分:0)

您是否尝试使用repl运行它?我建议用sbt运行它,然后你可以使用命令行参数从项目根目录运行sbt项目,如下所示:

sbt "run file1.txt file2.txt"

报价是必需的。如果你让sbt shell打开,那么运行它会快得多。使用

在项目根目录中打开shell
sbt

在sbt shell中:

run file1.txt file2.txt

在sbt shell中,没有引号。