【问题标题】:http(/* argument here */) How is this Object (Http) being used without an explicit or implicit method?http(/* 这里的参数 */) 在没有显式或隐式方法的情况下如何使用这个对象(Http)?
【发布时间】:2011-01-29 22:17:08
【问题描述】:

在使用 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 吗?我想一定是,因为作者是 Scala 专家。但这对我来说毫无意义。动作通常通过调用对象上的方法来执行,无论是显式为 object.doSomething() 还是隐式为 object = something(使用语法糖下的 apply() 方法)。

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

【问题讨论】:

    标签: scala databinder scala-dispatch


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我见过另一种形式:

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

      这是有效的 Scala 吗?我想它必须 be,因为作者是一个Scala 专家。但这对我来说毫无意义。

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

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

      val http = Http()
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这适用于“object”作为类的实例适用于“object”,如使用 Scala object 关键字定义的那样。补码是unapplyunapplySeq,它们呈现适合在模式匹配块中使用的值。为了完善它,case 类是(概念上)声明类的简写(使用编译器提供的 equalshashCodetoString 方法)(编译器提供)伴随 objectapplyunapply 以及可能定义的 unapplySeq 方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多