4

这是 Application.scala 中 zentask 示例中的一个函数。我试图理解它...

f: => 字符串是什么意思?

f: => String => Request[AnyContent] => Result 的链接怎么样

/** 
 * Action for authenticated users.
 */
def IsAuthenticated(f: => String => Request[AnyContent] => Result) = 
       Security.Authenticated(username, onUnauthorized) { user =>
       Action(request => f(user)(request))
}
4

2 回答 2

3

形式的参数fn: => String表示返回(或是)字符串的“生成器”(函数或值),因此,例如,您可能将方法定义为

def myMethod(fn: => String): String = "Fn output = " + fn

并按如下方式调用它(我在这里使用的返回类型通常可以由编译器推断,我只是出于教学目的添加它们):

def myFn: String = "Hello!"
// Alternatively: def myFn(): String = "Hello!"
// or: val myFn: () => String = "Hello!"
// or most simply: val myString = "Hello!"

val output = myMethod(myFn) // output = "Fn output = Hello!"

在此基础上,我们可以定义一个方法,该方法采用将 String 转换为 Int 的函数,例如:

def my2ndMethod(fn: String => Int): Int = fn("4")

并按如下方式调用它:

def my2ndFn(input: String) = 5 * input.toInt
// Alternatively: val my2ndFn: String => Int = input => 5 * input.toInt

val output2 = my2ndMethod(my2ndFn _) // output2 = 20

在您提供的情况下,您有一个更复杂的实体:返回(或是)一个接受 String 并返回另一个函数的函数,该函数又接受 aRequest[AnyContent]并且(最终)返回一个 Result(呸!)。

您也可以将其视为采用如下定义和使用的函数:

def authFn(username: String)(request: Request[AnyContent]): Result

val authenticatedResult = IsAuthenticated(authFn _)
于 2013-07-31T03:30:31.637 回答
1

实际上要弄清楚运算符如何关联有点棘手:

f: => String => Request[AnyContent] => Result

是相同的

f: (=> String) => (Request[AnyContent] => Result)

f接受一个请求并返回一个函数的函数也是如此=> String,该函数接受一个请求并返回一个结果。正如我在评论中指出的那样,请查看需要以下 scala 片段的简单英文翻译,以了解正在发生的一些事情。

那么为什么 have=> String作为第一个论点而不是 justString呢?我的猜测是,如果您希望用户传递一个按名称具有第一个参数的函数(这意味着每次需要时都会对其进行评估),它就会发挥作用。

所以说你有一个方法g

def g(s: => String): String => String = arg => s + arg

如果你想编写一个m将方法g作为参数的方法,那么你需要这样写:

def m(f: (=> String) => (String => String)) = f("a")("b")
m(g) // compiles

如果你这样写:

def n(f: String => (String => String)) = f("a")("b")
n(g) // does not compile
// found   : => String => (String => String)
// required:    String => (String => String)
于 2013-07-31T05:51:04.797 回答