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

В примере для кодирования с Json с использованием Отправка базы данных Натан использует объект (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 ]

6 голосов
/ 21 марта 2010

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

3 голосов
/ 21 марта 2010

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

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

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

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

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

val http = Http()

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

3 голосов
/ 21 марта 2010

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

...