1

小さな例で問題を再現しようとしています。次のコード スニペットに示されている場所でコンパイル エラーが発生しています。

class Outer {
    class Inner
}

object OuterUtil {
  val obj = new Outer
  object xyz extends obj.Inner
  //do something with xyz
}

//-------------------
object OuterUtil2 {
    var m_obj: Outer = null

    def createOuter() = {
        m_obj = new Outer
    }

    def anotherMethod() {
        //Compilation error here: stable identifier required, 
        //but OuterUtil2.this.m_obj found.
        object xyz extends m_obj.Inner
    }
}

object Test {
    OuterUtil2.createOuter
    OuterUtil2.anotherMethod
}

OuterUtil正常に動作しています。ではOuterUtil2、機能を 2 つの機能に分割しています。Outerインスタンスm_objを member として保存していますvar。このcreateOuterメソッドは、Outerインスタンスを作成して に保存しますm_obj。でanotherMethod、コンパイル エラーが発生します。修正方法はOuterUtil2

4

2 に答える 2

3

型のプレフィックス (つまり、m_objin m_obj.Inner) は安定した値でなければなりません。avarはそれをカットしません。valそれをにして、初期化を の外に移動できますcreateOuter

于 2012-05-26T17:02:03.260 に答える
1

関数で問題を解決したいだけの場合は、ここに解決策があります(関数内のvaravalに修正することにより)

def anotherMethod = {
  val obj = m_obj
  new obj.Inner
}

別の解決策は、いくつかのオプションを使用することですが、安定した識別子メソッドを超えるには、valout of m_objvalue を定義する必要があります。m_objが定義されていない場合、null ポインター例外がないため、このソリューションはより洗練されています。

object OuterUtil2 {
  var m_obj: Option[Outer] = None

  def createOuter {
    m_obj = Some(new Outer)
  }

  def anotherMethod = {
    m_obj match{
      case None => None
      case Some(_) => val obj = m_obj.get; Some(new obj.Inner)
    }
  }
}
于 2012-05-27T09:19:19.377 に答える