2

我有以下代码:

def authenticateByUsername(用户名:字符串,密码:字符串):布尔 = {
    val user = users.findOne(MongoDBObject(USERNAME -> username))
    如果(用户.isDefined){
        val pw = user.get.getAs(PASSWORD)
        如果(pw.isDefined)
            BCrypt.checkpw(pw.get, 密码)
        否则为假
    }否则为假
}

有没有更惯用的方式来做到这一点?这是一个 if-else 的噩梦,这在 Scala 中似乎并不正确。

4

1 回答 1

2

您是对的,有更好的方法,并且通常在 an 上使用get(或者,程度稍低,isDefinedOption是一个危险信号。在这种情况下,您可以使用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)

后者本质上只是 -comprehension 的脱糖版本for

于 2012-09-08T01:33:17.980 回答