2011-12-21 3 views
10

Может ли кто-то демистифицировать этот код, который является частью примера zentasks в структуре Play20. Мне любопытно, как это работает, если я новичок в Scala с Java, поэтому многие вещи трудно оборачивать вокруг.Scala Code demystify

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

Есть ли способ представить это с помощью синтаксиса java, я знаю, что это не то же самое, но может помочь мне понять подпись метода. Мне тяжело работать с порядком операций здесь. – chiappone

ответ

16

Вам нужно немного разбить подписи. f - это функция, которая принимает еще не вычисленную строку => String и возвращает другую функцию, которая принимает Request[AnyContent] и возвращает результат.

Security.Authenticated звонок принимает два списка параметров. Один, который имеет username и onUnauthorized. Вторая принимает функцию, принимающую пользователя и возвращающую действие.

Action.apply метод принимает функцию, Request[AnyContent] => Result

так, то Р называется в моде «карированы». Это называется первой функцией, а затем полученная функция сразу используется f(user)(request).

Вот то же самое обессахаренная (по крайней мере, насколько я могу) и некрасиво:

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

Вы можете увидеть, что компилятор делает немного аннотации типа работы удаления. Надеюсь, это поможет объяснить, как это происходит в сырой скале. По сути, функция выполняет много функциональной композиции.

2

Прежде всего, руководство пользователя для моего ответа: я буду использовать курсивом, чтобы указать функцию, которая используется без явного имени (см. anonymous functions).

IsAuthenticated - это метод, который принимает в качестве параметра аргумент f.

F является функцией, которая принимает Y в качестве параметра и производит экземпляр результата

У это функция, которая принимает Z в качестве параметра и производит экземпляр запроса [AnyContent]

Z является функцией, которая не принимает никаких параметров и возвращает строку

IsAuthenticated называет Security.Authentic ated, передача имени пользователя и onUnauthorized (функция вызова, когда пользователь не имеет права выполнять запрошенное действие).

Я не совсем уверен, что происходит на прошлом здесь myself- я не совсем хорошо, что с Scala yet- но мое предположение что Security.Authenticated случай класса, а следующее эквивалентно подклассов его и добавив конструктор в Java:

{ 
    Action(request => f(user)(request)) 
} 

Если что большая часть моего предположения правильны, то действие (которое является метод на Security.Authenticated) вызывается, передавая в качестве аргумента .

A - это функция, которая принимает объект Request (я угадываю это имя класса) и производит результат. Использование результата подразумевается здесь, потому что реализация A является вызовом f.

Поэтому, когда подкласс Security.Authenticated инициируется, вызывается действие, которое аутентифицирует пользователя для какого-либо действия (указано как String), а затем, если пользователь аутентифицирован, возвращает f (исходный параметр), который предположительно вызванный действием (после вышеупомянутой аутентификации). Этот вызов f возвращает результат, который также является функцией. Затем результат окончательно вызывается с запросом (который был передан в A) в качестве параметра.