2013-08-20 85 views
3

考慮以下2個對象爲什麼在沒有空括號的情況下定義Scala函數不會像函數那樣工作?

object TestObj1 { 
    def testMethod = "Some text" 
} 

object TestObj2 { 
    def testMethod() = "Some text" 
} 

,如果我直接調用這些方法,他們做什麼,我希望

scala> TestObj1.testMethod 
res1: String = Some text 

scala> TestObj2.testMethod 
res2: String = Some text 

但是現在如果我們定義下面的函數

,並嘗試要調用它,沒有()定義的方法不被接受。

scala> functionTakingFunction(TestObj1.testMethod) 
<console>:10: error: type mismatch; 
found : String 
required:() => String 
       functionTakingFunction(TestObj1.testMethod) 
              ^

scala> functionTakingFunction(TestObj2.testMethod) 
Call returns: Some text 

我還注意到,您不能使用括號,因爲它已經是一個字符串調用TestObj1.testMethod。但是什麼導致了這種行爲?

+2

只需指出,@ om-nom-nom答案是正確的(它可以完成任務),但類型不匹配的原因是「def foo」和「def foo()」是兩個不同的哺乳動物斯卡拉...雖然它們都是** 0-arity **方法,但空參數列表和沒有參數列表的結果不一樣,請參閱http://stackoverflow.com/questions/7409502/what-is-the-difference-between-def-foo -and-DEF-foo的功能於階。 –

+0

那些不是功能,它們是方法。 –

+0

@JörgWMittag我的命名不好。但是如果它們是功能它會有所作爲嗎? functionTakingFunction不知道你是傳遞一個函數還是一個方法,對吧? –

回答

9

你是不是傳遞方法,你調用它,然後它的結果突入呼叫。

如果要傳遞的方法,首先必須將其轉換成一個函數,並傳遞:

functionTakingFunction(TestObj1.testMethod _) 

這裏testMethod被轉換爲部分應用功能(認爲是「捆綁「)。

你所要做的就是因爲TestObj1.testMethod不計算爲function0(這是需要傳遞到functionTakingFunction)的原因,但到String,因爲它被聲明(沒有括號)的方式。

它適用於TestObj2,因爲testMethod是用圓括號定義的,因此只需輸入TestObj2.testMethod不會調用它。

+3

'testFunction'不是'Function',它是一種方法。與方法一起使用時的部分應用會產生'FunctionN'(其中N是從中派生出來的方法的參數的數量)。它無助於理解模糊非第一類實體(方法)和第一類函數值之間的區別。 –

+0

@RandallSchulz很公平,你能寫出你自己的答案嗎? (我會刪除我的) –

+0

@Randall。 'TestObj1.testFunction2'也被評估爲'function0',針對所有實際需要,這裏的問題是'testFunction'被評估爲一個String,所以儘管'testFunction'和'testFunction2'實際上是方法,om -nom-nom解決方案是正確的([工作示例](http://ideone.com/Hwo1Bq)) –

0

functionTakingFunction(TestObj1.testFunction)被稱爲functionTakingFunction("Some text") - 其被評估,而不是通過

-1

在這裏,你沒有通過該功能。你所要做的是評估TestObj1.testFunction,然後將該結果傳遞給functionTakingFunction 但如果你看到functionTakingFunction的定義,上面清清楚楚地寫着

def functionTakingFunction(callback:() => String) 

意味着該功能預計與返回類型爲單元的功能。但是TestObj1.testFunction沒有返回類型。

單位返回類型,並沒有返回類型之間的區別是:

  • 沒有返回類型意味着此方法不會返回任何
  • 單位返回類型意味着此方法將返回這是沒有意義的有價值的東西。

希望它現在可以幫助你。快樂的編碼和享受斯卡拉。

+0

這個答案在很多層面上讓我感到困惑。首先是Scala中的一個案例,我根本得不到回報(甚至不是Unit)。第二個不是「=>字符串」恰恰意味着它期望返回類型爲String的函數。 –

+1

「表示該函數需要返回類型爲單位的函數。」 - 不,這意味着它期望一個返回類型爲「String」的函數。 「'TestObj1.testFunction'沒有返回類型。」 - 錯誤,它有返回類型'String'。在Scala中沒有「不返回類型」的東西。一切都有一個返回類型。 Everything *必須*有一個返回類型,因爲一切都是表達式,因此一切都返回* something *。 –

相關問題