2016-05-05 111 views
0

我有以下功能:如何讓此代碼更優雅?

private def solveError(hostIp: String, command: String) = { 
    commandSlave(hostIp, "STOP SLAVE") match { 
    case Success(x) => commandSlave(hostIp, command) match { 
     case Success(y) => commandSlave(hostIp, "START SLAVE") match { 
     case Success(z) => Success(z) 
     case Failure(ex) => Failure(ex) 
     } 
     case Failure(ex) => Failure(ex) 
    } 
    case Failure(ex) => Failure(ex) 
    } 
} 

我認爲必須有寫這個功能更優雅的方式,但我不知道怎麼樣。使用嵌套匹配的情況對我來說並不合適,但我是Scala的新手,我不知道是否有更好的方法。任何幫助深表感謝。

+0

可能更適合於代碼審查 – Hypaethral

回答

5

假設commandSlave回報TryflatMap是你想要什麼:

commandSlave(hostIp, "STOP SLAVE") 
    .flatMap(_ => commandSlave(hostIp, command)) 
    .flatMap(_ => commandSlave(hostIp, "START SLAVE")) 

flatMapTry的scaladocs:

返回從這種成功或返回該應用的價值給定函數如果這是一個失敗。

您也可以使用for理解這裏,在內部desugars到flatMap S也是一樣的序列:

private def solveError(hostIp: String, serverHost: Host, backHost: Host, command: String) = 
    for { 
    _ <- commandSlave(hostIp, "STOP SLAVE") 
    _ <- commandSlave(hostIp, command) 
    z <- commandSlave(hostIp, "START SLAVE") 
    } yield z 
+1

也許你還可以顯示如何將此轉化爲一對理解? –

+0

@PeterNeyens,謝謝,更新。 – Aivean

+1

這正是我所期待的,看起來好多了。謝謝! – osocron