加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

需要以下scala片段的简体中文翻译

发布时间:2020-12-16 09:12:47 所属栏目:安全 来源:网络整理
导读:我是新来的 scala和playframework.有人可以将下面的代码片段翻译成普通英文吗?在这里找到的上下文: http://www.playframework.org/documentation/2.0.4/ScalaSecurity /** * This method shows how you could wrap the withAuth method to also fetch your
我是新来的 scala和playframework.有人可以将下面的代码片段翻译成普通英文吗?在这里找到的上下文: http://www.playframework.org/documentation/2.0.4/ScalaSecurity

/**
 * This method shows how you could wrap the withAuth method to also fetch your user
 * You will need to implement UserDAO.findOneByUsername
 */
def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request =>
  UserDAO.findOneByUsername(username).map { user =>
    f(user)(request)
  }.getOrElse(onUnauthorized(request))
}

解决方法

第1部分:首先让我们来讨论curried语法:

withUser是一种使用类型为User =>的curried函数f的方法.请求[AnyContent] =>结果.它需要一个User对象并返回另一个接受Request并返回Result的函数.打破它,如果f是那个功能,那么:

val g = f(user) // g is a function
val result = g(request) // returns a result
// same as:
val result = f(user)(request)

实际上,f只是一个函数,它需要两个参数,而不是调用f(a,b)你调用f(a)(b).

withAuth也是一个采用咖喱功能的方法.它与用户几乎相同的类型.

第2部分:现在你如何使用这些方法:

如here所述,play通过告诉它如何将Request对象转换成Result对象来定义应用程序逻辑.

withAuth是一个帮助函数,可以为您提供身份验证,方便地检索用户名.所以你这样使用它:

def index = withAuth { username => implicit request =>
  Ok(html.index(username))
}

它返回一个接收Request并返回Result的函数,这是播放需要的.但是它需要的是一个curried函数(需要一个用户名)并返回一个函数(需要一个请求).请求参数被标记为隐式,因此它可以隐式传递到需要隐式请求参数的任何函数/方法调用.为了这个解释的目的,只要忽略隐含的关键字.

第3部分:用户翻译

那么它的签名与auth类似,目标是以相同的方式使用,除了第一个参数将是User而不是String.所以它需要一个User => Request =>结果.请求特征采用指示其内容类型的类型参数.这里是AnyContent.所以用户的参数的正确类型是User =>请求[AnyContent] =>结果.这意味着你可以这样使用它:

withUser { user => implicit request =>
  // do something with user and request to return a result
}

如果你看看withUser的定义,它所做的就是调用withAuth:

def withUser(f: User => Request[AnyContent] => Result) = withAuth { 
  // ...
}

所以它将返回与asAuth相同的类型,这意味着它将返回一个将请求转换成Result的函数(参见上面的第2部分).这意味着我们可以这样使用它:

def index = withUser { user => implicit request => 
  Ok(html.index(user))
}

作为withAuth的参数传递的是咖喱功能.我介绍了中间值,以便您可以遵循以下类型:

username => // first param is the username as a String
  implicit request => // second param is the request
    // here we have to return a Result...
    // we lookup the user - we may not have one:
    val userOption: Option[User] = UserDAO.findOneByUsername(username)
    // f is the code block that will be provided inside withUser { f }
    // Part 1 explains the f(user)(request) syntax
    // We call f to get a result,in the context of the Option monad
    val resultOption: Option[Result] = userOption.map(user => f(user)(request))
    // if we have a result,return it; otherwise return an error.
    resultOption.getOrElse(onUnauthorized(request))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读