2016-09-14 120 views
1

這個非常簡單的工作表內容表明瞭問題:從上面的表內容斯卡拉工作不IntelliJ IDEA的評估對象2016.2

object Test { 
println("This does not print!") 
    add(5, 6) 
} 

println("This however prints!") 
add(5, 6) 

def add(a: Int, b: Int): Int = a + b 

結果是:

defined module Test 

This however prints! 
res0: Unit =() 
res1: Int = 11 

add: add[](val a: Int,val b: Int) => Int 

基於JetBrains official website Scala Worksheets example和所有其他我發現的可靠資源(如Martin Odresky's own examples in Functional Programming in Scala course),我期望執行object Test的內容。我的軟件是:

  • OS X埃爾卡皮坦
  • IntelliJ IDEA的2016.2
  • SBT插件1.8.0
  • SBT版本0.13.12
  • 的Scala插件2016年2月1日
  • 斯卡拉2.11版.8
+0

'我期待對象Test的內容執行'我不希望它執行。工作表是花哨的回報。我永遠不會期望repl做到這一點 – Jatin

+1

那麼,我發現的所有例子(包括JetBrains網站本身的頁面)都顯示工作表的工作原理與此類似。我已將它添加到我的答案中。 – ddinchev

回答

5

我想這是你想要什麼:

object Test { 
    println("This does not print!") 
    add(5, 6) 

    println("This however prints!") 
    add(5, 6) 

    def add(a: Int, b: Int): Int = a + b 
} 

工作表的工作原理是,如果你定義object範圍之外定義的對象並沒有什麼,它會執行它爲Test extends App。這就是intellij頁面顯示的內容

如果您在object範圍之外有任何語句,那麼它將被視爲其他object,並且編譯器會像其他任何東西一樣初始化它。這就是你正在經歷的。

+0

完美,謝謝你的回答!我將如何執行已定義的對象(我相信它是單例)? – ddinchev

+0

你可以通過它的名字來執行:'Test' – Samar

+1

'object'的主體不過是構造函數體。所以當你第一次調用它時,當類加載器加載它時,主體將被執行。隨後,它不會在下次調用構造函數初始化。 – Jatin

2

如果所有代碼都在裏面,scala工作表會執行對象test {....}的內容那個對象。如果對象外有一些代碼,它將只定義該Test對象(而不運行它)。

object Test { 
    println("This does not print!") 
    def add(a: Int, b: Int): Int = {print("Sum:" + a + b); a + b} 
    add(2, 2) 
} 

// defined the above Test object 

Test // executes the Test object