Scala 使用for和yield创建对象

Scala 使用for和yield创建对象,scala,playframework-2.0,Scala,Playframework 2.0,我在一个使用Play框架的应用程序中看到了这段代码 val credentials : Option[(ConsumerKey, RequestToken)] = for { apiKey <- Play.configuration.getString("twitter.apiKey") apiSecret <- Play.configuration.getString("twitter.apiSecret") token <- Play.configuration

我在一个使用Play框架的应用程序中看到了这段代码

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)
)

为了理解,您可以方便地处理多个
选项。如果其中一个值为
None
,则代码将失败,但使用
for
可以执行以下操作:

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

用于理解的
的一个优点(这是正确的术语)是它在第一次失败时终止。例如,如果未配置
apiSecret
,则不会尝试获取
token
tokenSecret
,当然也不会调用
ConsumerKey()
RequestToken()

“用于压缩”是不适用的loop@cchantep我认为这是一种理解,它是一个循环。参见此
用于一元合成,而不是循环(这只是一种特殊情况)。先看一下网络教程,它是一个循环,它是一个压缩,它是一个理解。。。不,这是超级斯卡拉:)
scala> for {a <- Some("s1"); b <- Some("s2")} yield (a, b)
res1: Option[(String, String)] = Some((s1,s2))
scala> for {a <- Some("s1"); b <- None} yield (a, b)
res2: Option[(String, Nothing)] = None
Some("s1").flatMap { a => Some("s2").map { b => (a, b) } }