http(/* аргумент здесь */) Как этот объект (Http) используется без явного или неявного метода?

В примере для кодирования с помощью Json с использованием Databinder Dispatch Натан использует объект (Http) без метода, показанного здесь:

import dispatch._
import Http._
Http("http://www.fox.com/dollhouse/" >>> System.out )

Как он это делает?

Спасибо за все ответы, к сожалению, я не был достаточно конкретным...

Похоже, что он просто передает аргумент конструктору класса или сопутствующего объекта Http.

В другом примере я видел другую форму:

http = new Http
http(/* argument here */)

Это действительная Скала? Я предполагаю, что это должно быть, потому что автор - эксперт по Scala. Но это не имеет смысла для меня. Действия обычно выполняются путем вызова методов для объектов, будь то явно как object.doSomething() или неявно как object = что-то (используя метод apply() под синтаксическим сахаром).

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

3 ответа

Решение

Я видел другую форму:

val http = new Http
http(/* argument here */)

Это действительная Скала? Я предполагаю, что это должно быть, потому что автор - эксперт по Scala. Но это не имеет смысла для меня.

В первой строке конструктор класса Http вызывается для создания нового экземпляра. Ничего не отличается от Java. Во второй строке метод apply класса Http вызывается в этом экземпляре с (/* argument here */), Это очевидно для Scala.

Может быть некоторая путаница, когда у класса есть компаньон object с apply метод. В этом случае (при условии, что метод apply просто вызывает construtor класса-компаньона), новые экземпляры могут быть созданы без new ключевое слово:

val http = Http()

создает новый экземпляр. Это очень распространенный шаблон, хотя методы применения сопутствующего объекта могут делать что угодно и иметь любую подпись.

Он работает путем определения метода, называемого apply на объекте. Если такой метод присутствует, аргументы могут быть применены к самому объекту, что означает, что внутренне аргументы передаются apply метод.

Если объект имеет apply метод, вы можете "вызвать" объект, как если бы он был методом (который фактически вызовет его метод apply).

Другие вопросы по тегам