2015-01-06 75 views
2

例如,我有這樣的代碼:如何在Scala類中初始化函數類型參數?

class Foo(name: String = "", callback: String => String) { 

    def doCallback(arg: String): String = { 
    callback(arg) 
    } 
} 

問題:

Foo類的構造函數,如何給callback參數的默認值?可以將它設置爲null嗎?還是有更好的選擇?

class Foo(name: String = "", callback: String => String = null) { 
    ... 
} 

2.如果問題的回答沒有。 1不是null,在doCallback方法中調用它之前如何檢查callback?如果你改變的doCallbackOption[String]你會不會做模式匹配的簽名

class Foo(name: String = "", callback: String => String = null) { 

    def doCallback(arg: String): String = { 
    if (callback != null) callback(arg) else "" // the checking of not null 
    } 
} 
+1

定義一個閉包返回null屁股默認參數 – markusw

+0

@markusw:謝謝,現在我明白了:) – null

+1

只要有可能不要使用'null',請使用'Option'代替 – Andrey

回答

4
class Foo(name: String = "", callback: Option[String => String] = None) { 

def doCallback(arg: String): String = { 
    val call: Option[String] = callback.map(c => c(arg)) // which will either be None or Some(String) 

    call match { 
     case Some(s: String) => s 
     case None => null 
    } 
    } 
} 

當然:例如,假設null是可以接受的,我可能會像下面這樣做。

一般情況下,避免在斯卡拉有null是一個很好的做法。其中一個好處是沒有得到NullPointerException s。

然而,這種方法確實會迫使您在Some()的範例實例化中通過callback

或者,更符合您的原始請求:

class Foo(name: String = "", callback: String => Option[String] = {(s) => None}) { 

    def doCallback(arg: String): String = { 
    val call: Option[String] = callback(arg) 

    call match { 
     case Some(s: String) => s 
     case None => null 
    } 
    } 
} 
+0

在兩個給定的例子中,哪一個更可取?第二個讓我必須傳遞在實例化'Foo'類時返回'Option [String]'的回調函數。 – null

+0

如果我使用你的第二個例子,那麼我應該使用這樣的代碼? 'println(new Foo(callback = s => Some(「Hi」+ s))。doCallback(「Scala」))' – null

+0

是的,看起來是正確的。 – Andrey

1

正如其他人所說,這是很好用Option包裹的一切。
但如果你只是想在默認的結果是"",事情可能更容易一點:

val alwaysEmpty = { given: String => "" } 

class Foo(val doCallback: String => String = alwaysEmpty) 
+0

你說'用Option'包裝一切都很好。我很好奇,對於其他類的屬性,比如'name:String =「」',你認爲我最好用'Option'包裝它嗎?因此:'name:Option [String] = None' – null

+1

這取決於在每種情況下''「的含義。如果* null *和* empty *都被'「」描述,但被認爲是兩個不同的東西,那麼它們不應該放在'「」'中,而是分別放入''''和'Option [String]'中。如果* null *和* empty *是相同的東西,那麼'「」'可以用於兩者。 –

+1

我的意思是......如果你不會區分''''和'None',那麼它可以保持爲'String'。如果'「」'有兩個不同的含義,那麼它應該被'Option'包裝以表示其中一個爲'None'。 –