Почему я не могу опустить "apply" в this.apply (_) в Scala? - PullRequest
6 голосов
/ 25 декабря 2011

Обратите внимание на следующий код

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

Может кто-нибудь объяснить мне, что происходит?

Ответы [ 2 ]

11 голосов
/ 25 декабря 2011

Вы не можете, потому что this () внутри конструктора является вызовом конструктора этого объекта ( this () где-либо еще генерирует ошибку компиляции) и не может быть преобразован в вызов apply () , поскольку он скрывает конструктор и делает невозможным вызов другого конструктора в вашем объекте. this (аргументы) всегда является вызовом метода конструктора (как в Java, так и в Scala), поэтому, когда вы находитесь внутри собственного объекта, вам всегда нужно явно вызывать apply (args) .

4 голосов
/ 27 декабря 2011

Принят неправильный ответ.Вы можете сделать вывод, в чем проблема на самом деле из того факта, что это прекрасно скомпилируется:

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

this (...) представляет вызов конструктора, только когда сайт вызова является вспомогательным конструктором.В остальное время это призыв к подаче заявления, как вы и предполагали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...