3

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

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

他是怎么做到的?

谢谢大家的回答,可惜我不够具体。。。

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

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

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

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

我能想到的是,除了构造对象之外,构造函数还被用来做一些事情。换句话说,它会产生副作用,例如在这种情况下会在网络上进行某些操作。

4

3 回答 3

6

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

于 2010-03-21T00:31:20.813 回答
3

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

于 2010-03-21T00:31:46.993 回答
3

我见过另一种形式:

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

这是有效的斯卡拉吗?我想一定是,因为作者是 Scala 专家。但这对我来说毫无意义。

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

object当类有一个方法的伴侣时,可能会有些混乱apply。在这种情况下(假设 apply 方法只是调用伴生类的构造函数),可以在没有new关键字的情况下创建新实例:

val http = Http()

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

于 2010-03-21T04:29:52.620 回答