4

これは、Application.scala の zentask サンプルの関数です。私はそれを理解しようとしています...

f: => String とはどういう意味ですか?

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 を受け取る関数を返す (またはその関数である) もので、さらに を受け取り、Request[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 スニペットのプレーンな英語の翻訳が必要ですをご覧ください。

=> Stringでは、最初の引数としてだけではなく、なぜ持つのStringですか? 私の推測では、ユーザーが名前で最初の引数を持つ関数を渡すことを意図した場合(必要になるたびに評価されることを意味します)、それが機能するようになります。

だからあなたがメソッドを持っているとしましょう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 に答える