我试图找出如何将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运行此对象构造函数?
答案 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打开,那么运行它会快得多。使用
在项目根目录中打开shellsbt
在sbt shell中:
run file1.txt file2.txt
在sbt shell中,没有引号。