Scala 有没有更惯用的方法使用Casbah检查密码?
我有以下代码: 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) else false }else false } def authenticateByUsername(用户名:字符串,密码:字符串):布尔={ val user=users.findOne(MongoDBObject(用户名->用户名)) 如果(用户已定义){ val pw=user.get.getAs(密码) 如果(pw.已定义) BCrypt.checkpw(pw.get,密码) 否则错误 }否则错误 }Scala 有没有更惯用的方法使用Casbah检查密码?,scala,mongodb,casbah,Scala,Mongodb,Casbah,我有以下代码: 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)
有没有更惯用的方法?这是一个if-else的噩梦,在Scala中似乎并不正确。你是正确的,有一个更好的方法,通常在
选项上使用get
(或者,在稍微小一点的程度上,是定义的
)是一个危险信号。在这种情况下,您可以使用进行理解:
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
}
后者本质上只是用于理解的的一个去糖化版本。更好,我有类似的东西,但我没有考虑将结果
包装在一个选项中,然后对结果使用getOrElse
。我觉得第一本书更具可读性。大声朗读时,听起来更感性。
def authenticateByUsername(username: String, password: String): Boolean =
users.findOne(MongoDBObject(USERNAME -> username)).flatMap(
_.getAs(PASSWORD)
).map(
BCrypt.checkpw(_, password)
).getOrElse(false)