如果条件为真,如何返回?

时间:2014-07-27 01:27:23

标签: scala playframework

我仍然掌握Scala和函数式编程。

我正在尝试实现一种身份验证方法,但我只想在密码与哈希匹配的情况下返回,而且我不太清楚如何做到这一点。

请原谅下面的代码,我仍在努力试图将功能包裹起来。希望我已经足够说明我想要完成的任务。我只想返回一个结果, IF 仅限密码与提供的密码匹配,否则我希望它的行为就像没有找到任何结果一样。

def authenticate(name: String, password: String): Option[Member] = {
  DB.withConnection { implicit c =>
    SQL("select * from member where lower(membername)={membername}").on(
    'membername -> name.toLowerCase()
  ).as(Member.member.singleOpt)

    if(BCrypt.checkpw(password, Member.member.password)) {
       Member.member.singleOpt
    } else {
       null
    }
  }
}

我正在使用PlayFramework和Anorm。但是,我认为这更像是一个普通的Scala问题。

3 个答案:

答案 0 :(得分:4)

as(Member.member.singleOpt)会返回Option[Member]。您可以filter Option就像任何集合一样,这样您就可以过滤掉凭据不良的用户。

def authenticate(name: String, password: String): Option[Member] = {
    DB.withConnection { implicit c =>
        SQL("select * from member where lower(membername)={membername}").on(
            'membername -> name.toLowerCase()
        ).as(Member.member.singleOpt)
        .filter(member => BCrypt.checkpw(password, member.password))
    }
}

filter的内部功能只有在找到Member时才会被调用。如果BCrypt.checkpw(password, member.password)为false,则Some(member)将变为None,因此当凭据不正确时,authenticate将返回None

答案 1 :(得分:2)

返回类型是Option,表示它必须是Some(包含单个值)或None(不包含任何内容)。 Member.member.password应该是Option [Member]类型,所以else case应该是None(任何Option的子类)。

http://www.scala-lang.org/api/current/index.html#scala.Option

答案 2 :(得分:1)

您的方法返回Option[Member],这是一个很好的功能样式。如果您的身份验证通过,您可以返回Some[Member] Member.member.singleOptNone。否则返回null而不是{{1}}。