2013-09-25 4 views
18

У меня возникли трудности с поиском конкретных ответов на то, что я знаю, что-то тривиальное. Я хотел бы понять, как блоки работают в Scala. Я исхожу из java/ruby ​​background, и кажется, что scala имеет совершенно другой способ использования блоков.Понимание блоков Scala

Следующий код от Play! Framework website. Я хотел бы понять, что Действие семантически. Это объект или функция, которая принимает блок, или, возможно, ни один.

object Application extends Controller { 

    def index = Action { 
    Ok(views.html.index("Your new application is ready.")) 
    } 

} 

Если это функция, возможно, это синтаксический сахар для следующего (в этом случае, как же Scala проходит вокруг блоков за кадром):

def index = Action({ 
    Ok(views.html.index("Your new application is ready.")) 
    }) 

Или это какой-то SCALA синтаксис I» я не знаю.

Любые ссылки на исходный код Scala помогут мне понять, как это работает за кулисами.

ответ

21

Вам лучше подумать о блоках scala как java-анонимных классах (например, как функции Guava), а не как ruby-блоки. Собственно говоря, если вы декомпилировать код SCALA вы увидите более или менее тот же код (taken from Guava examples):

Function<String, Integer> lengthFunction = new Function<String, Integer>() { 
    public Integer apply(String string) { 
    return string.length(); 
    } 
}; 

Разница заключается в том, что Scala предоставляет много синтаксических и позволяете писать выше код, как:

val lengthFunction = { string: String => string.length } 

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

def index = Action({ 
    Ok(views.html.index("Your new application is ready.")) 
    }) 

Здесь действие, скорее всего, объект применяется метод. Еще один scala sugar: язык позволяет вам писать Foo(bar) и означает Foo.apply(bar).Далее, you can drop round braces when your call isn't ambiguous, так что да, это на самом деле метод, который был призван как:

def index = Action({ 
    Ok(views.html.index("Your new application is ready.")) 
}) 

И есть что-то вроде этого в качестве подписи:

object Action { 
    def apply(block: => Result) = ??? 
} 

Как уже было сказано по @yan, оно Scala способ сказать эй, я это функция, которая принимает другую функцию, которая производит Результат

Обессахаренный вызов будет выглядеть

def index = Action.apply(new AbstractFunction[Result] { 
     def apply() = Ok.apply(views.html.index.apply("...")) 
}) 
8

Здесь есть несколько вещей. Action - это объект, который реализует метод apply(), что вызвано, когда вы рассматриваете объект как функцию. Есть несколько apply()implementations. Первая реализация использует параметр by-name.

Scala поддерживает концепцию, известную как «параметры имени», которые являются обычными параметрами, за исключением того, что они оцениваются только тогда, когда выполняется код, который ссылается на них. Они помогают создавать конструкты, которые выглядят так, как будто они являются частью языка, не прибегая к макросам. В этом случае блок, окружающий Ok(..), является просто регулярным блоком операторов, причем последнее значение используется как значение блока. Пример, который вы предоставили, будет работать без брекетов. По сути, вы просто передаете результат метода apply метода Ok Actionapply.

Вторая версия apply() действительно выполняет полную анонимную функцию, которая отображает запрос на результат. В этом случае вы можете передать анонимную (или названную) функцию.

+0

Спасибо за ответ. Поэтому из того, что я собираю, это синтаксический сахар для Action.apply(). Удаление сахара, как бы выглядело все заявление? – b1nd

+0

Утверждение, поскольку у вас есть это по существу «Action.apply (Ok.apply (views.html.index (« Ваше новое приложение готово. »)))'. Если вы посмотрите на определение 'apply()' в указанном мной URL-адресе, вы увидите стрелку до типа параметра. Это просто указывает на параметр «по имени», описанный выше. (Кроме того, это не совпадение, что синтаксис по-имени похож на синтаксис анонимной функции без аргументов) – yan

+0

Ссылка на игру doc сломана, кстати. Иногда, SO parser испортил ссылки, содержащие знак доллара. –

Смежные вопросы