2013-07-19 64 views
8

除了嚴重的性能問題,Scala還是一門非常強大的語言。因此,我現在經常在Bash內部使用腳本任務。有沒有辦法像我能用Python文件一樣來執行* .scala文件?據我所知,Python使用字節碼來執行程序,就像JVM一樣。然而,爲了達到這個目的,我不需要調用pythonc(比如scalac或者javac)。因此我希望Scala能夠以類似的方式行事。使用Scala編寫腳本:如何啓動未編譯的腳本?

+1

http://stackoverflow.com/questions/7620144的可能的複製? –

+2

我不確定附加到「嚴重」的定量含義,但是Scala在使用時沒有特別注意性能而接近其他JVM語言的性能,並且在將適當的優化應用於經驗確定的熱點時與Java非常具有競爭力。當然,如果你包含JVM啓動時間,它不會與本地代碼甚至傳統的解釋型語言(如Python或Perl)相媲美。但是,當您每次運行「腳本」時編譯代碼時,它都會嘗試任何人的耐心 - 不要這樣做。 –

回答

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 > 

然而,事後,我沒有在bash的視覺反饋,所以我有呼叫'清除'。

但在編寫腳本和執行沒有問題:

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

然後,沒有與外殼的問題。

隨着外圍類,代碼就不會被執行:

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)) 
} 

但隨着instatiating一類,你可以執行它的代碼,而無需使用衆所周知的(希望如此)「主要」的方式:

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 
17

scala man page提供了有關如何,如果他們的腳本運行Scala代碼片段,Windows和非Windows平臺上的一些例子(以下從手冊頁複製示例):

的Unix

#!/bin/sh 
    exec scala "$0" "[email protected]" 
    !# 
    Console.println("Hello, world!") 
    argv.toList foreach Console.println 

的Windows

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

要加快後續運行中您可以用-savecompiled選項緩存編譯片段:

#!/bin/sh 
    exec scala -savecompiled "$0" "[email protected]" 
    !# 
    Console.println("Hello, world!") 
    argv.toList foreach Console.println 

更新:爲斯卡拉2.11(在this similar answer指出的),你可以現在只是這樣做在Unix上:

#!/usr/bin/env scala 
println("Hello, world!") 
println(args.mkString(" "))