2014-01-10 33 views
0

我知道程序員都應該來包裝他們的代碼在應用程序中的對象:斯卡拉是否有全局對象或類?

object Hello extends App { 
    println("Hello, World") 
} 

它需要在Eclipse中,如果我想要得到任何輸出。然而,當我試着寫一些代碼(很隨意地)在Emacs,我寫的是這樣的:

class Pair[+T](val first: T, val second: T) 

trait Friend[-T] { 
    def befriend(someone: T) 
} 

def makeFriendWith(s: Student, f: Friend[Student]) { 
    f.befriend(s) 
} 

好像有一個封裝在功能makeFriendWith沒有統一的對象或類。斯卡拉像JavaScript一樣,一切都附加到全局對象?如果不是,這個函數附加了什麼?

此外,爲什麼可以在控制檯工作(我遵照scala命令,它工作),但在Eclipse中不起作用? Application對象有什麼用途?

回答

1

作爲一種JVM語言,Scala不能真正創建除類和接口以外的任何頂層實體。

然而,它確實有一個「包裝對象」的概念,它創造了不包含在類或特徵中的價值實體幻象(val,vardef)。

有關包對象的信息,請參閱http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html

+0

是否有關於此包對象的更多信息? –

+2

這是回答問題嗎?我想不,但也許這只是我。 –

+0

我添加了一個指向包對象文檔的鏈接。我認爲它們是該語言的一個非常小的特徵,很少使用它們。 –

2

您可以在控制檯中定義類似這樣的方法,只有(後臺)會自動將它們包裝在一個匿名類中。

在控制檯之外,沒有這樣的奢侈品。

5

Scala沒有頂層defs,但腳本可以由REPL或scala腳本運行器運行。

腳本的確切行爲取決於您運行它的方式。

REPL可以逐行或全部運行腳本。 (比較:paste:paste -raw:load-i init.script和未來的選項-I init.script。)

有一個issue about sensitive scripting。腳本運行者應該意識到,如果你想運行一個App

another effort使腳本編制階段,很容易定製。有關其當前啓發式的代碼註釋,請滾動至Scripter.scala

簡而言之,你的defs必須包裝在頂層實體中,但究竟是如何發生的是依賴於上下文的。

a recent effort爲REPL提供另一種烘烤包裝方案。

這些都不是語言規範的要求,任何超過sbt構建文件的特殊規則都是由語言定義的。

0

可以直接在Eclipse中運行這樣的代碼:使用Scala worksheet。 IntelliJ IDEA Scala插件也支持它。