2010-11-25 1 views
8

私は、このScalaのコードがあるとします。入れ子になったコンパニオンオブジェクトのメンバーがクラスで自動的に表示されないのはなぜですか?

object Outer { 

    object Inner { 
    val B = "B" 
    } 
    class Inner { 
    def b = B 
    } 
} 

私はこれをコンパイルすることを期待しますが、Bbの定義からアクセスすることはできません。私はそれを動作させるためにimport Inner._class Innerに追加する必要があります。何故ですか?コンパニオンオブジェクトInnerは正しく定義されていませんか?

+0

私はここにもう一度(この事を忘れて)この問題が新人にとってどれほど重要かを示しています。私は、「外」がその質問に何の役割も果たしていないと思う。それがなくても全く同じです。これを聞いてくれてありがとう! – akauppi

答えて

6

これはちょうどこのように動作するはずです - import Inner._を使用すると、一貫した動作です。


Javaの静的メンバーと同様の動作を実現するには、通常、コンパニオンオブジェクトが必要です。 Scalaの方法は、コンパニオンクラスのプライベート/保護されたmemebersはそれからアクセスすることができるという利点と、離れたシングルトンオブジェクトへのすべての静的メンバーを移動することです:

object Outer { 

    object Inner { 
    def print(inner: Inner) = inner.B // compiles! 
    }  
    class Inner { 
    private val B = "B" 
    }  
} 

あなたはクラスのファクトリとしてコンパニオンオブジェクトを使用することができますプライベートコンストラクタで:コンパニオンオブジェクトのメンバーがクラスにインポートされるかどう

scala> object Outer { 
    | 
    | object Inner { 
    |  def newInstance = new Inner() 
    | } 
    | class Inner private() { 
    |  private val B = "B" 
    | } 
    | } 
defined module Outer 

scala> Outer.Inner.newInstance 
res1: Outer.Inner = [email protected] 

scala> new Outer.Inner 
<console>:7: error: constructor Inner cannot be accessed in object $iw 
     new Outer.Inner 
    ^
+0

Bを定数として定義したいと思います。クラスOuter.Innerで使用され、Outer.Inner.Bとして外部からアクセス可能です。 Innerがネストされていない場合、私はインポートが必要ではない印象を受けましたが、Outerクラスを削除しても私の例はコンパイルされないので、私は間違っていました。だからベット方法は何ですか? 'public static final String B =" B ";と同様の定数を定義するためにJavaで記述しますか? –

+0

問題は表示されません - > https://gist.github.com/715219 –

+0

OK、余分なインポートが必要であるという確認が必要でした。それは私にとっては大丈夫です。私はメンバーがコンパニオンオブジェクト/クラスに自動的にインポートされたと思っていました。 –

11

、それはプログラマがそれをcontroleできずに、クラスの名前空間を汚染します。これは価値がある(それでも悪い)悪いことではないかもしれませんが、私は実際にはそれを関数で見たくありません。

ちょうどapply()について考えてみてください。または、特性から継承する関数(何かを失うことなく名前を変更することはできません)。これらの関数が自動的にクラスの名前空間にインポートされた場合、コンパイラはどちらを使用するかを知りません。したがって、クラスとオブジェクトに関数func()がある場合は、クラスコードにthis.func()と書くだけで、どのクラスを呼び出すかを確認することができます。

名前空間をきれいに保つことができると考えてください。 import Inner._

+0

インポートが必要な理由の正当な理由。たくさんの意味があります。 –

関連する問題