如何在Scala中处理[object]或None?

时间:2013-07-01 02:21:21

标签: scala oauth playframework-2.0 slick securesocial

我正在Slick中实现一个Users表,其中的User类扩展了SecureSocial的Identity特征。我无法从可选的不可存储数据库类型对象转换为可选的原始数据库类型。

要参考:Slick docsSecureSocial docs(要为SecureSocial生成API文档,请从their Github拉出,进入“模块代码”目录,然后运行{{1然后查看module-code / target / api文件夹并打开index.html)

我拥有什么

play doc案例类中使用此参数:

User

Scaladoc中OAuth1Info的新实例构造函数如下所示:

oAuth1Info: Option[securesocial.core.OAuth1Info]

现在使用new OAuth1Info(token: String, secret: String)方法(as explained here):

*

我正在尝试做什么

如果未提供def * = stuffs ~ oAuth1InfoToken ~ oAuth1InfoToken ~ moreStuff <> ( // the following is the apply method { t => User(stuffs, Some(OAuth1Info( (t._9).getOrElse(""), (t._10).getOrElse("")) ), moreStuffs) }, // the following is the unapply method { (r: User) => Some( (r.stuffs, (r.oAuth1Info).getOrElse(None).token , // ERROR (r.oAuth1Info).getOrElse(None).secret , // ERROR r.moreStuffs) ) }

,请在None中插入数据库

oAuth1Info

否则,取出Option[securesocial.core.OAuth1Info] = None对象并获取令牌和密码,并将其存储到我的数据库中各自的列中。

在这个映射投影的顶部是一个500+字符行,我是否需要做某种

OAuth1Info

?可以使用单线模式匹配器吗?我现在在代码中迷失了......

感谢您的帮助


如果您希望到目前为止看到我的完整实施......

Scala + Slick + SecureSocial =遗憾地是tl; dr code

我知道这段代码是一面文字。如果它存在,多行Scala代码在这里会很棒吗? Pastebin

2 个答案:

答案 0 :(得分:1)

我还没有完全掌握原始问题中的类型,但您答案中的oAuth1Unapply方法可以重写为

def oAuth1Unapply(smth: Option[securesocial.core.OAuth1Info]): (String, String) =
  smth.map(oa => (oa.token, oa.secret)).getOrElse(("",""))

map方法将函数应用于Option的内容(如果它不是None),并将结果作为Some值返回,或以其他方式离开结果为None

答案 1 :(得分:0)

我很傻。我懂了。

所以我确实使用模式匹配器。

def oAuth1Unapply(smth: Option[securesocial.core.OAuth1Info]): (String, String) =  {
    smth match {
          case None => ("", "")
          case _ => (smth.getOrElse(OAuth1Info("","")).token, smth.getOrElse(OAuth1Info("","")).secret)
        }
}

然后我做

val oa1 = oAuth1Unapply(r.oAuth1Info)
def * = stuffs ~ oAuth1InfoToken ~ oAuth1InfoToken ~ moreStuff <> 
( // the following is the apply method
{ t => User(stuffs, 
    Some(OAuth1Info( (t._9).getOrElse(""), (t._10).getOrElse("")) ), 
    moreStuffs)
}, // the following is the unapply method
{
    (r: User) => Some( (r.stuffs, 
        oa1._1, oa2._2
        r.moreStuffs) )
}