【问题标题】:Why can't I omit "apply" in this.apply(_) in Scala?为什么我不能在 Scala 的 this.apply(_) 中省略“apply”?
【发布时间】:2012-01-27 10:39:16
【问题描述】:

观察以下代码

trait Example {
  type O
  def apply(o: O)
  def f(o: O) = this.apply(o)
}

在 Scala 中编译得很好。我希望我可以像往常一样省略apply,写def f(o: O) = this(o)。但是,这会导致令人兴奋的错误消息

type mismatch;  found   : o.type (with underlying type Example.this.O)
                required: _31.O where val _31: Example
possible cause: missing arguments for method or constructor

谁能给我解释一下这是怎么回事?

【问题讨论】:

    标签: scala types apply


    【解决方案1】:

    接受的答案不正确。您可以从编译良好的事实推断出实际问题是什么:

    trait Example {
      def apply(o: String): String = o
      def f(o: String) = this(o)
    }
    

    this(...) 仅在调用站点是辅助构造函数时表示对构造函数的调用。其余时间都是申请的电话,正如您想象的那样。

    【讨论】:

    • 对不起,我无法推断出实际问题是什么,但我明白你的意思。你能进一步解释一下吗?
    • 这是抽象类型的错误。请注意,如果您将类型 O 设为具体(例如“type O = String”)或将其设为类型参数(例如“trait Example[O]”),则非编译示例有效。
    • 你知道这个错误的问题编号吗?
    【解决方案2】:

    你不能,因为构造函数中的 this() 是对这个对象的构造函数的调用(this() 其他任何地方都会产生编译失败)并且不能进行 apply() 调用,因为它会隐藏构造函数,并且无法调用对象中的另一个构造函数。 this(args) 始终是对构造函数方法的调用(在 Java 和 Scala 中),因此在您自己的对象中时,您始终必须显式调用 apply(args).

    【讨论】:

    • 嗯!当然,谢谢。我对此感到困惑,因为在我的示例中,我有一个别名为this(例如trait Example { f => ... }),不知何故,f(o) 是对构造函数的调用不太明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多