我試圖找到表達的代碼看起來類似於這樣的清潔方法:鏈接斯卡拉嘗試包含實例選項
def method1: Try[Option[String]] = ???
def method2: Try[Option[String]] = ???
def method3: Try[Option[String]] = ???
method1 match
{
case f: Failure[Option[String]] => f
case Success(None) =>
method2 match
{
case f:Failure[Option[String]] => f
case Success(None) =>
{
method3
}
case s: Success[Option[String]] => s
}
case s: Success[Option[String]] => s
}
正如你所看到的,這個嘗試在序列中的每個方法,如果再一個失敗執行停止並且基本匹配解決該故障。如果方法1或方法2成功但包含無,則會嘗試序列中的下一個方法。如果執行到達方法3,其結果總是返回,而不管成功或失敗。這在代碼中工作正常,但我發現很難跟蹤發生的事情。
我喜歡使用一種理解
for
{
attempt1 <- method1
attempt2 <- method2
attempt3 <- method3
}
yield
{
List(attempt1, attempt2, attempt3).find(_.isDefined)
}
,因爲它的美麗,它是什麼做的是相當清楚的。但是,如果所有方法都成功,則每次都執行它們,而不管先前的方法是否返回可用的答案。不幸的是,我不能那樣做。
任何建議,將不勝感激。
類型不匹配。 'Option'中的'orElse'不會帶'Try [Option]'。 –
固定在我的編輯,雖然它不像我現在想的那樣高雅現在:( – Thayne