2016-03-04 182 views
0

我試圖改變一個方法到一個函數,但我有跟返回類型的煩惱:斯卡拉函數返回類型

sealed trait CronJobStatus 
case object CronJobSuccess extends CronJobStatus 
case class CronJobFailure(error: Option[String] = None) extends CronJobStatus 

我的方法(工作)是:

def jobNotFoundFailure(name: String): CronJobStatus = CronJobFailure(Some(s"Job with name $name not found")) 

當試圖具有jobNotFoundFailure作爲一個功能,我無法找到正確的語法來指定,它返回一個CronJobStatus,我有這個功能(但它返回CronJobFailure)

val jobNotFoundFailure = (name: String) => CronJobFailure(Some(s"Job with name $name not found")) 

這意味着我不能在需要CronJobStatus的情況下使用此函數。例如從地圖和摺疊得到一個選項時:

cronJobsMap.get(name).fold(jobNotFoundFailure(name))(doDelete) 

回答

1

你可以寫

val jobNotFoundFailure: String => CronJobStatus = 
    name => CronJobFailure(Some(s"Job with name $name not found")) 
+0

嘗試了超過半個小時尋找語法,但找不到它。謝謝! :) – klogd

2

另一個可能的選擇是:

val jobNotFoundFailure = (name: String) => 
    CronJobFailure(Some(s"Job with name $name not found")): CronJobStatus 

順便說你的代碼(忽略了一個事實,我不知道如何doDelete看起來像)似乎工作,即使jobNotFoundFailure是String => CronJobFailure

cronJobsMap.get(name).fold(jobNotFoundFailure(name))(doDelete) 

每當需要CronJobStatus你可以把CronJobFailure。無論何處需要功能A => CronJobStatusA => CronJobFailure也是有效的,因爲Function1[-T, +R]在返回值的類型中是協變的。