2011-12-24 3 views
6

Обратите внимание на следующий кодПочему я не могу опустить «применить» в this.apply (_) в Scala?

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 

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

ответ

4

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

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

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

+0

Извините, я не могу понять, что представляет собой настоящая проблема, но я вижу вашу точку зрения. Не могли бы вы объяснить дальше? –

+0

Это ошибка с абстрактными типами. Обратите внимание, что пример не компиляции работает, если вы создаете конкретный тип O (например, «тип O = String»), или вместо него вместо него введите параметр типа (например, «trait Example [O]».) – extempore

+0

, вам известно, что номер выпуска для этой ошибки? –

11

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

+0

Huh! Конечно, спасибо. Я был смущен этим, потому что в моих примерах у меня был псевдоним для 'this' (например,« trait Example {f => ...} '), и почему-то гораздо менее очевидно, что' f (o) 'является вызовом конструктор. –

 Смежные вопросы

  • Нет связанных вопросов^_^