Scala 使用for和yield创建对象
我在一个使用Play框架的应用程序中看到了这段代码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
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) } }