2012-10-19 7 views
7

、私は次の操作を実行できます。apply()はパッケージオブジェクトの省略形では使用できないのはなぜですか?通常のオブジェクトに

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

しかし、パッケージオブジェクト上で、これは動作しません:

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

は、いくつかの基本的な制限はありますか?それとも、コンパイラをちょっと微調整して修正することができる実装の制限ですか?あなたはそれをせずに適用できること

+0

これで何をしたいですか?なぜノーマルオブジェクトを使用しないのですか? –

+1

@SergeyPassichenko - たとえば、コードベース全体にインポートなしでいくつかのメソッドを呼び出す場合 - パッケージオブジェクト "monkey"とメソッド "apply"がある場合、どの場所でも "monkey()"を実行できます。これは一例ですが、私はパッケージオブジェクトが通常のオブジェクトと大きく異なる理由にも興味があります。 – Rogach

答えて

7

唯一の方法はこれです:

A.`package`() 

Aが値またはメソッド、およびf()が有効であるために、fが持っている言語仕様の状態を表すものではありませんので、これがありますapplyメソッドを持つメソッド型または値型を持つことができます。これを変更するためにコンパイラを "微調整"することがどれほど簡単かわかりませんが、努力する価値はあるのでしょうか。このような長さにしたい場合は、Predefにメソッドを追加する方が簡単です。

+0

'Predef'にメソッドを追加するにはどうしたらいいですか? – Madoc

+0

@Madoc:標準ライブラリのソースコードを入手し、メソッドを追加してコンパイルします –

関連する問題