2013-08-11 2 views
4

В настоящее время я начинаю с игрового фреймворка, но моего знания Scala недостаточно.Как интерпретировать последовательность => в Scala?

Как я знаю, значение => указывает на то, что IsAuthenticated имеет какие-то функции в качестве параметра. Я узнал также, что f: => String ... - это функция без входного значения. Но как я интерпретирую полную строку с ее 3 =>? И далее вниз, что именно происходит во второй строке с => f (пользователь) (запрос)? Какова целевая функция для объекта пользователя и запроса?

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

ответ

5
=> String => Request[AnyContent] => Result 

легче читать с круглыми скобками добавлено:

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

Вы можете попробовать это в REPL. Например:

scala> def foo(f: => String => Int => Char): Char = f("abcdefgh")(4) 
foo: (f: => String => (Int => Char))Char 

В этом примере е является нульарной функция вызова по имени параметр, который возвращает функцию (назовем эту функцию г). g - функция, которая принимает параметр String и возвращает еще одну функцию (h). h - функция, которая принимает параметр Int и возвращает символ Char.

Пример вызова:

scala> foo { s: String => { i: Int => s.charAt(i) } } 
res0: Char = e 

Давайте идти через тип каждого выражения в теле метода, как это оценивали:

  • f
    • Тип: String => (Int => Char)
    • Значение: { s: String => { i: Int => s.charAt(i) } }
  • f("abcdefgh")
    • Тип: Int => Char
    • Значение: { i: Int => "abcdefgh".charAt(i) }
  • f("abcdefgh")(4)
    • Тип: Char
    • Значение: 'e'
+3

Он называется 'call by name' (' по имени parameter'), а не 'nullary function'. – senia

+0

И как я могу назвать foo в вашем примере? Какая функция будет соответствовать сигнатуре foo? И для чего первый => хороший? –

+0

@senia В чем разница? –

0

Несколько дополнений к принятому ответ

  1. О Security.Authenticated

    безопасности.Заверенные (имя пользователя, onUnauthorized) {пользователь => Действие (запрос => F (пользователь) (запрос)) }

    Security.Authenticated - кажется, функция, которая принимает два списка параметров. Первый список параметров:

    (username:String, onUnauthorized:Boolean) 
    

    и второй список один аргумент:

    (g:User => Action) 
    

    полная подпись может быть что-то вроде:

    def Authenticated(username:String, onUnauthorized:Boolean)(g:User => Action) 
    
  2. Action, кажется, класс который принимает функцию в своем конструкторе:

    class Action(h:Request => Result) 
    

    Аргумент конструктора является новой функцией

    def hActual(request:Request):Result = f(user)(request) 
    

    (def должны user в объеме, потому что не дано в качестве аргументов. Например, hActual может быть немедленно объявлены до Action вызова конструктора:

    def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user => 
        def hActual(request:Request):Result = f(user)(request) 
        Action(hActual) 
    } 
    

    )

  3. Также это кажется так, что конструктор может быть вызвана с помощью curring:

    def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user => 
        Action(f(user)) 
    } 
    
Смежные вопросы