http(/ *参数在这里* /)如何在没有显式或隐式方法的情况下使用此Object(Http)?

时间:2010-03-21 00:19:43

标签: scala databinder scala-dispatch

在使用Databinder Dispatch使用Json进行编码的示例中,Nathan使用了一个没有方法的Object(Http),如下所示:

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

他是怎么做到的?

谢谢你所有的答案,不幸的是我不够具体......

看起来它只是将一个参数传递给类或伴随对象Http的构造函数。

在另一个例子中,我看到了另一种形式:

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

这是有效的Scala吗?我想它一定是,因为作者是Scala专家。但这对我没有意义。操作通常通过调用对象上的方法来执行,无论是显式地为object.doSomething()还是隐式地为object = something(使用语法糖下的apply()方法)。

我能想到的是构造函数除了用于构造对象之外还用于执行某些操作。换句话说,它有副作用,例如在这种情况下关闭并在网上做某事。

3 个答案:

答案 0 :(得分:6)

它通过在对象上定义一个名为apply的方法来工作。如果存在这样的方法,则可以将参数应用于对象本身 - 这意味着在内部将参数传递给apply方法。

答案 1 :(得分:3)

如果一个对象有一个apply方法,你可以“调用”该对象,就好像它是一个方法(实际上会调用它的apply方法)。

答案 2 :(得分:3)

  

我见过另一种形式:

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

这是有效的Scala吗?我想它必须   是的,因为作者是斯卡拉   专家。但这对我没有意义。

在第一行中,调用Http类的构造函数来创建新实例。没有什么不同于Java。在第二行中,使用(/* argument here */)在该实例上调用Http类的apply方法。这显然是Scala特有的。

当班级有object个伴随apply的方法时,可能会有一些混淆。在这种情况下(假设apply方法只调用伴侣类的construtor),可以在没有new关键字的情况下创建新实例:

val http = Http()

创建新实例。这是一种非常常见的模式,虽然伴随对象应用方法可以做任何事情并且有任何签名。