2012-09-17 91 views
2

當我第一次遇到以下代碼時,我很困惑。在scala中,使用函數名稱作爲返回值?

在類Element中,有三個函數定義。

爲什麼高度和寬度可以直接使用內容作爲Array [String]的變量?

是因爲Scala中的每個函數都是一個對象或其他規則?

我來自C++的世界,所以定義真的讓我感到困惑。

abstract class Element { 
    def contents: Array[String] 
    def height: Int = contents.length 
    def width: Int = if (height == 0) 0 else contents(0).length 
} 
+2

我沒有注意到這個問題的第一次閱讀,但值得指出的是,在'Element'類中實際存在* no函數*。有三種*方法*。 (內容)方法的(幾乎)等效的*函數*將被聲明爲'val contents:()=> Array [String]'。請參閱[在Scala中的方法和函數之間的區別](http://stackoverflow.com/questions/2529184/difference-between-method-and-function-in-scala)和從該問題鏈接的博客帖子,瞭解爲什麼這個區別事項。 –

回答

6

這只是語法。例如,表達式contents.length被編譯成方法的調用,接着對結果調用length方法。

通常,在零參數方法調用中可以省略括號。實際上,當調用方法(如您的contents方法)的括號必須時,它們的定義中沒有參數列表

請注意,此功能是斯卡拉致力於uniform access principle的一部分。 contents方法可以被替換爲contents屬性而不會打斷調用者。

+0

感謝您的回答。但我認爲「在沒有參數列表的內容方法等方法上必須省略括號」。並不完全正確。那麼println()呢?我在Scala編程中閱讀了這個內容,因爲「副作用」,最好不要在println()中放下()。 – jerry

+0

我會澄清我的答案 - 我指的是那些沒有參數列表,而不是方法(如的println)接受可變數量的參數(包括0)的方法。 –

+0

明白了!謝謝。 – jerry

2

沒什麼很特別的是怎麼回事。相比於C++,你打的follownig差異:方法

  • 調用,而不在斯卡拉參數不需要括號 - length在這種情況下是一樣的length()
  • 方法定義不需要被包裹在{}如果它們只包含一個表達
  • 函數返回最後一個表達式的值,在他們的身上

更和C/Java一樣的方式來寫,這將是

def height() : Int = { return contents.length(); } 

它會做同樣的,但更加詳細的 - 爲什麼Scala是爲一個真棒語言閱讀代碼一個很好的示範。

+0

相反,'def height():Int'。 –

+0

是的。我忘了分號:) – themel