2013-08-01 41 views
2

只是撿起斯卡拉。儘管有許多在線教程,但發現使用該語言的基礎知識還是非常棘手。有人可以解釋下面的代碼的細微差別嗎? (使用階2.10.2)Scala def ambiguity

案例1

scala> def greet = println("helloo") 
greet: Unit 
scala> greet 
helloo 
scala> greet() 
<console>:9: error: Unit does not take parameters 
      greet() 
      ^

案例2

scala> def greet =()=>println("helloo") 
greet:() => Unit 
scala> greet 
res31:() => Unit = <function0> 
scala> greet() 
helloo 

案例3

scala> def greet() = println("helloo") 
greet:()Unit 
scala> greet 
helloo 
scala> greet() 
helloo 

然而令人驚奇的是有沒有明確的概念描述Scala語言 對不起,如果這是一個完全新手的問題!

+0

對於「Scala語言沒有明確的概念描述」幾乎爲-1。反對投票的翻轉定義是「不顯示任何研究工作」。但顯然你嘗試了一些,你只是沒有嘗試,呃,谷歌。 –

+0

@ som-snytt我不想在這裏成爲一個聰明的屁股,但你應該注意到我在我的問題中陳述了以下內容:**儘管有很多在線的教程**。在此之前已經解決了這個問題的地方張貼鏈接是更有建設性的。 – vecktorking

+0

我誇張的修辭效果,抱歉讓你的山羊。我的觀點是,雖然斯卡拉有細微差別,但缺乏文檔和博客並不是其缺點之一。 http://www.artima.com/pins1ed/composition-and-inheritance.html#10.3和http://stackoverflow.com/q/12334936/1296806關於paramless def。 HTH。 FWIW,它仍然很棘手。 –

回答

8

Scala可以有任意數量的參數塊,而不僅僅是一個。所以:

def f(i: Int) = i + 2 
def g(i: Int)(j: Int) = i + j 
def h(i: Int)(j: Int)(b: Boolean) = if (b) i + j else i * j 

所有的作品。參數塊是一種組織參數和向編譯器發送信號的方法,用於如何將方法(即def)的轉換處理爲函數(這是一種可以作爲參數傳遞的方法)。現在

,如果你有空參數塊你可以忽略它們爲簡潔:

def a()()() = println("Hi") // Do nothing! 
a()()()      // Full call 
a()       // Drop some 
a       // Drop all of them 

所有調用a的做同樣的事情。但你不能添加比屬性更多的空參數塊 - 這些被解釋爲對該方法返回的任何內容的調用。

a()()()()     // No go, calls `()` on `Unit` which doesn't exist 

因此,這涵蓋了你的情況1和3。

現在,你也可以有一個方法返回一個函數。一個函數將參數(只是一個塊!)映射到輸出,但與方法不同,您可以傳遞它。 (Scala是擅長這樣在需要的時候自動包裝方法引入功能。)

所以

def b =() => println("Hi") 

說,每次調用b時候,你應該創建一個函數,它不帶任何參數,並返回任何println("Hi")回報。事實上,它返回Unit,即沒有返回值 - 它實際上是一個值,但它始終是相同的實體:()。這避免了必須爲返回void以及具有返回值的方法返回程序/方法的特殊情況。一切都有回報價值(至少在概念上)。無論如何,如果你有一個:

val c = b 

,那麼你可以把它叫做:

c() // Will print "Hi" 

,或者你可以創建並呼籲所有在一個去

b() // The `b` part creates the function, `()` calls it. 

旅遊諮詢通過如Programming in Scala將涵蓋您在這方面需要的所有基礎知識。 (我喜歡做一個紙質副本,即使有人不得不爲此付錢。)

+0

感謝您提供簡潔明瞭的回覆。這確實很清楚我的概念。來自Java的長期經驗,Scala的驚人深度和廣度! – vecktorking

+0

它不會將你的代表推到六位數字,但你有沒有考慮過在YouTube上發佈一些實時動作教程?然後你可以說,「我在我的教程中詳細討論這個......」等。 –

+0

@ som-snytt - 我比作者更像一位作家。其他人可以對YouTube進行改編。 –