2

私は次のコードを持っています:

def authenticateByUsername(username:String、password:String):Boolean = {
    val user = users.findOne(MongoDBObject(USERNAME-> username))
    if(user.isDefined){
        val pw = user.get.getAs(PASSWORD)
        if(pw.isDefined)
            BCrypt.checkpw(pw.get、password)
        それ以外の場合はfalse
    } else false
}

これを行うためのより慣用的な方法はありますか?それはif-elseの悪夢であり、Scalaでは正しくないようです。

4

1 に答える 1

2

より良い方法があることは間違いありません。一般に、を使用するget(または、程度はわずかですがisDefined)Optionは危険信号です。この場合、for-comprehensionを使用できます。

def authenticateByUsername(username: String, password: String): Boolean = {
  val result: Option[Boolean] = for {
    user <- users.findOne(MongoDBObject(USERNAME -> username))
    pass <- user.getAs(PASSWORD)
  } yield BCrypt.checkpw(pass, password)

  result getOrElse false
}

または、もう少し簡潔に:

def authenticateByUsername(username: String, password: String): Boolean =
  users.findOne(MongoDBObject(USERNAME -> username)).flatMap(
    _.getAs(PASSWORD)
  ).map(
    BCrypt.checkpw(_, password)
  ).getOrElse(false)

後者は本質的には - 内包表記の脱糖バージョンですfor

于 2012-09-08T01:33:17.980 に答える