2012-10-19 6 views
7

Na normalnych obiektach, mogę wykonać następujące czynności:Dlaczego apply() nie można używać w formie skróconej na obiektach pakietu?

object A { 
    def apply = "!" 
} 
A() // "!" 

Ale na obiektach pakietu, to nie działa:

package object A { 
    def apply = "?" 
} 
A.apply // "?" 
A() // compile error 
    // error: package A is not a value 

Czy istnieje pewne fundamentalne ograniczenie? Czy jest to tylko ograniczenie implementacji, które mogę naprawić, nieco poprawiając kompilator?

+0

Co chcesz z tym zrobić? Dlaczego po prostu nie używać zwykłych przedmiotów? –

+1

@SergeyPassichenko - na przykład, aby wywołać pewną metodę bez importowania przez cały kod - jeśli masz obiekt pakietu "małpa" z metodą "zastosuj", wtedy będziesz w stanie zrobić "małpa()" w dowolnym miejscu. To jest przykład - ale mnie też interesuje, dlaczego obiekty pakietu są tak różne od normalnych obiektów. – Rogach

Odpowiedz

7

Jedynym sposobem można zrobić to bez zastosowania to:

A.`package`() 

To dlatego A nie oznacza wartość lub metodę, a stany specyfikacji języka, że ​​dla f() było ważne, f ma mieć typ metody lub typ wartości za pomocą metody apply. Nie mam pojęcia, jak łatwo można "podkręcić" kompilator, aby to zmienić, ale wątpię, czy warto. Jeśli chcesz przejść do takich długości, łatwiej byłoby po prostu dodać swoją metodę do Predef.

+0

Jak mogę dodać metodę do 'Predef'? – Madoc

+0

@Madoc: otrzymujesz kod źródłowy standardowej biblioteki, dodajesz swoją metodę i kompilujesz ją –

Powiązane problemy