有没有更惯用的方法来使用 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 检查密码?的主要内容,如果未能解决你的问题,请参考以下文章

有没有更惯用的方法来拆分 std::vector?

有没有更好(更干净)的方法来使用三元运算符(不重复代码)编写这个 JS 代码?

惯用/快速 Django ORM 检查 mysql/postgres 上是不是存在

有没有更惯用的方法从 Option[IO[Option[A]] 获取 IO[Option[A]] 然后使用序列和映射连接?

使用指向类私有方法的指针的命名参数惯用语

检查 Python 变量类型的最佳(惯用)方法是啥? [复制]