斯卡拉 – 对守卫的理解

前端之家收集整理的这篇文章主要介绍了斯卡拉 – 对守卫的理解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果有警卫,我如何用于理解?

type Error = String
  type Success = String
  def csrfValidation(session:Session,body:JsValue):Either[Error,Success] = {
    val csrfRet = for (csrfSession <- csrfStateSessionValidation(session).right;
                           csrfReq <- csrfStateReqBodyValidation(body).right if (csrfSession == csrfReq)) yield (csrfReq)
    if (csrfRet.isRight)
      Right(csrfRet)
    else {
      Logger.warn("request and session csrf is not the same")
      Left("Oops,something went wrong,request and session csrf is not the same")
    }
  }

使用它时出现此错误.

'withFilter' method does not yet exist on scala.util.Either.RightProjection[Error,Success],using `filter' method instead

编辑:
我又得到了一个错误.我认为如果使用guard,它会返回一个选项结果.

[error] type mismatch;
[error]  found   : Option[scala.util.Either[Nothing,controllers.ProfileApiV1.Success]]
[error]  required: scala.util.Either[?,?]
[error]  csrfReq <- csrfStateReqBodyValidation(body).right if (csrfSession == csrfReq)) yield (csrfReq)

EDIT2

This is what I did to fix above error. I also move if-guard to later process.

val result = for {
  foo <- Right[String,String]("teststring").right
  bar <- Right[String,String]("teststring").right
} yield (foo,bar)

result fold (
  ex => Left("Operation Failed with " + ex),v => v match { 
    case (x,y) =>
        if (x == y) Right(x)
        else Left("value is different")
  } 
)

解决方法

我相信你所看到的是编译器警告而不是实际错误. RightProjection不支持withFilter,这是保护条件的“首选”(但尚未要求),因此使用普通的旧过滤器.至于这些功能的区别及其产生的原因,请查看下面的链接以获得解释.

http://scala-programming-language.1934581.n4.nabble.com/Rethinking-filter-td2009215.html#a2009218

猜你在找的Scala相关文章