使用Scala编写脚本:如何启动未编译的脚本?

ide*_*xer 8 scripting scala

除了严重的性能问题,Scala是一种非常强大的语言.因此,我现在经常在Bash中使用它来执行脚本任务.有没有办法像我用Python文件那样执行*.scala文件?据我所知,Python使用字节码来执行程序,就像JVM一样.但是,没有任何叫做pythonc(比如scalac或javac)的东西我需要调用才能完成这个任务.因此,我希望Scala能够以类似的方式行事.

met*_*sim 17

斯卡拉手册页提供了有关如何,好像他们是一个脚本,用于Windows和非Windows平台(以下从手册页复制实例)都运行Scala代码片段一些例子:

Unix的

   #!/bin/sh
   exec scala "$0" "$@"
   !#
   Console.println("Hello, world!")
   argv.toList foreach Console.println
Run Code Online (Sandbox Code Playgroud)

视窗

   ::#!
   @echo off
   call scala %0 %*
   goto :eof
   ::!#
   Console.println("Hello, world!")
   argv.toList foreach Console.println
Run Code Online (Sandbox Code Playgroud)

要加快后续运行,您可以使用以下-savecompiled选项缓存已编译的片段:

   #!/bin/sh
   exec scala -savecompiled "$0" "$@"
   !#
   Console.println("Hello, world!")
   argv.toList foreach Console.println
Run Code Online (Sandbox Code Playgroud)

更新:从Scala 2.11开始(如此类似答案中所述),您现在可以在Unix上执行此操作:

#!/usr/bin/env scala
println("Hello, world!")
println(args.mkString(" "))
Run Code Online (Sandbox Code Playgroud)


use*_*own 2

我不使用 python,但在 Scala 中,我能做的最脚本化的事情是:

thinkpux:~/proj/mini/forum > echo 'println(" 3 + 4 = " + (3 + 4))' | scala 
Welcome to Scala version 2.10.2 (Java HotSpot(TM) Server VM, Java 1.7.0_09).
Type in expressions to have them evaluated.
Type :help for more information.

scala> println(" 3 + 4 = " + (3 + 4))
 3 + 4 = 7

scala> thinkpux:~/proj/mini/forum > 
Run Code Online (Sandbox Code Playgroud)

然而,之后,我在 bash 中没有视觉反馈,所以我必须调用“clear”。

但是编写脚本并执行是没有问题的:

thinkpux:~/proj/mini/forum > echo 'println(" 3 + 4 = " + (3 + 4))' > print7.scala 
thinkpux:~/proj/mini/forum > scala print7.scala 
 3 + 4 = 7
Run Code Online (Sandbox Code Playgroud)

那么,shell就不存在问题了。

对于封闭类,代码将不会被执行:

thinkpux:~/proj/mini/forum > echo -e 'class Foo {\nprintln(" 3 + 4 = " + (3 + 4))\n}\n'
class Foo {
println(" 3 + 4 = " + (3 + 4))
}

thinkpux:~/proj/mini/forum > scala Foo.scala 
thinkpux:~/proj/mini/forum > cat Foo.scala 
class Foo {
println(" 3 + 4 = " + (3 + 4))
}
Run Code Online (Sandbox Code Playgroud)

但是通过实例化一个类,您可以在其中执行代码,而无需使用众所周知的(希望如此)“主要”方式:

thinkpux:~/proj/mini/forum > echo -e 'class Foo {\nprintln(" 3 + 4 = " + (3 + 4))\n}\nval foo = new Foo()'  > Foo.scala
thinkpux:~/proj/mini/forum > cat Foo.scala 
class Foo {
println(" 3 + 4 = " + (3 + 4))
}
val foo = new Foo()
thinkpux:~/proj/mini/forum > scala Foo.scala 
 3 + 4 = 7
Run Code Online (Sandbox Code Playgroud)