有没有更惯用的方法来使用 Casbah 检查密码?
Posted
技术标签:
【中文标题】有没有更惯用的方法来使用 Casbah 检查密码?【英文标题】:Is there a more idiomatic way to use Casbah to check a password? 【发布时间】:2012-09-08 01:17:37 【问题描述】:我有以下代码:
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 中似乎并不正确。
【问题讨论】:
【参考方案1】:你说得对,有更好的方法,通常在Option
上使用get
(或者,程度稍低,isDefined
)是一个危险信号。在这种情况下,您可以使用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
-comprehension 的脱糖版本。
【讨论】:
这样更好,我有类似的东西,但我没有考虑将result
包装在一个选项中,然后在结果上使用getOrElse
。我发现第一个更具可读性。大声朗读,听起来更感性。以上是关于有没有更惯用的方法来使用 Casbah 检查密码?的主要内容,如果未能解决你的问题,请参考以下文章
有没有更好(更干净)的方法来使用三元运算符(不重复代码)编写这个 JS 代码?
惯用/快速 Django ORM 检查 mysql/postgres 上是不是存在
有没有更惯用的方法从 Option[IO[Option[A]] 获取 IO[Option[A]] 然后使用序列和映射连接?