为了账号安全,请及时绑定邮箱和手机立即绑定

Scala中的方法参数验证,用于理解和单子

Scala中的方法参数验证,用于理解和单子

我正在尝试验证方法的参数是否为空,但找不到解决方案...有人可以告诉我该怎么做吗?我正在尝试这样的事情:  def buildNormalCategory(user: User, parent: Category, name: String, description: String): Either[Error,Category] = {    val errors: Option[String] = for {      _ <- Option(user).toRight("User is mandatory for a normal category").right      _ <- Option(parent).toRight("Parent category is mandatory for a normal category").right      _ <- Option(name).toRight("Name is mandatory for a normal category").right      errors : Option[String] <- Option(description).toRight("Description is mandatory for a normal category").left.toOption    } yield errors    errors match {      case Some(errorString) => Left( Error(Error.FORBIDDEN,errorString) )      case None =>  Right( buildTrashCategory(user) )    }  }
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

我完全支持Ben James的建议,为产生null的api做包装。但是编写该包装器时仍然会遇到相同的问题。所以这是我的建议。


为什么单子为什么要理解?IMO过于复杂。这是您可以执行的操作:


def buildNormalCategory

  ( user: User, parent: Category, name: String, description: String )

  : Either[ Error, Category ] 

  = Either.cond( 

      !Seq(user, parent, name, description).contains(null), 

      buildTrashCategory(user),

      Error(Error.FORBIDDEN, "null detected")

    )

或者,如果您坚持让错误消息存储参数名称,则可以执行以下操作,这将需要更多样板:


def buildNormalCategory

  ( user: User, parent: Category, name: String, description: String )

  : Either[ Error, Category ] 

  = {

    val nullParams

      = Seq("user" -> user, "parent" -> parent, 

            "name" -> name, "description" -> description)

          .collect{ case (n, null) => n }


    Either.cond( 

      nullParams.isEmpty, 

      buildTrashCategory(user),

      Error(

        Error.FORBIDDEN, 

        "Null provided for the following parameters: " + 

        nullParams.mkString(", ")

      )

    )

  }


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 775 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信