2017-07-22 57 views
1

我看到這個代碼在使用播放框架使用創建對象併產生

val credentials : Option[(ConsumerKey, RequestToken)] = for { 
    apiKey <- Play.configuration.getString("twitter.apiKey") 
    apiSecret <- Play.configuration.getString("twitter.apiSecret") 
    token <- Play.configuration.getString("twitter.token") 
    tokenSecret <- Play.configuration.getString("twitter.token") 
} yield (
    ConsumerKey(apiKey, apiSecret), 
    RequestToken(token, tokenSecret) 
) 

的應用程序,我不知道如果我的理解使用循環只是創建選項的原因[(ConsumerKey,RequestToken) ]對象。爲什麼會選擇使用「for循環」來做到這一點?

爲什麼不是這樣?

val apiKey = Play.configuration.getString("twitter.apiKey") 
val apiSecret = Play.configuration.getString("twitter.apiSecret") 
val token = Play.configuration.getString("twitter.token") 
val tokenSecret = Play.configuration.getString("twitter.token") 

val tuple: (ConsumerKey, RequestToken) = (ConsumerKey(apiKey.get, apiSecret.get), RequestToken(token.get, tokenSecret.get)) 
val credentials2 : Option[(ConsumerKey, RequestToken)] = Option(tuple) 
+2

「壓縮」不適用於循環 – cchantep

+0

@cchantep我認爲它的理解和它是一個循環。看到這個https://alvinalexander.com/scala/scala-for-comprehension-syntax-for-yield-loop-examples – Programmer

+0

'for'是一元組合,而不是循環(這只是一個特定的情況)。首先看看網絡教程 – cchantep

回答

2

理解允許您以方便的方式處理多個Option

scala> for {a <- Some("s1"); b <- Some("s2")} yield (a, b) 
res1: Option[(String, String)] = Some((s1,s2)) 

也:如果一個值分別爲None如下代碼會失敗,但for你可以做

scala> for {a <- Some("s1"); b <- None} yield (a, b) 
res2: Option[(String, Nothing)] = None 

只是爲了更詳細地解釋這個代碼,上面的代碼被編譯器轉換成以下(這是它解決了Option):一個for的C

Some("s1").flatMap { a => Some("s2").map { b => (a, b) } } 
1

一個優點理解(這是適當的術語)是它在第一次失敗時終止。例如,如果沒有配置apiSecret,則不會嘗試獲得tokentokenSecret,當然也不會撥打ConsumerKey()RequestToken()

+0

你是對的......它是「理解」 – Programmer