需要以下阶段的纯英文翻译(Need plain english translation of the

2019-08-03 09:34发布

我是新来斯卡拉和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))
}

Answer 1:

第1部分:首先,让我们解决咖喱语法:

withUser是采用一个咖喱功能的方法f类型的User => Request[AnyContent] => Result 。 它需要一个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也是需要咖喱功能的方法。 它具有几乎相同的类型withUser

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

正如解释在这里 ,玩耍,你告诉它如何改造定义应用程序逻辑Request对象到Result的对象。

withAuth是一个辅助函数,它为您的身份验证的照顾和方便检索的用户名。 所以你使用这样的:

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

它返回一个函数,接受Request并返回一个Result ,这是玩的需求。 但是,它需要的是一个咖喱功能(即需要用户名),并返回一个函数(即取的请求)。 请求参数被标记为隐式 ,因此它可以被隐式地传递给需要的隐式请求参数的任何功能/方法调用。 对于这种解释的目的,只是忽略了implicit关键字。

第3部分:翻译withUser

那么,它的签名是类似withAuth ,目标是为它在相同的方式使用,除了第一个参数将是User ,而不是一个String 。 因此,必须采取一个User => Request => Result 。 请求性状需要其指示其内容的类型的类型参数。 这是AnyContent 。 因此,正确类型的参数withUserUser => Request[AnyContent] => Result 。 这意味着你将能够使用它像这样:

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

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

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

因此,这将返回相同类型withAuth这意味着它将返回一个转动的功能Request到一个Result (见上面第2部分)。 这意味着我们将能够使用它像这样:

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

什么作为参数传递withAuth是咖喱功能。 我介绍了中间val ,让你可以按照类型:

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))


文章来源: Need plain english translation of the following scala snippet
标签: scala