1

Joshua Suareth の著書 Scala の 93 ページにあるバインディングの優先順位に関する 4 番目のルールを詳しく理解しようとしています。

この規則によると:

定義が発生するソース ファイルにないパッケージ句によって使用可能になった定義の優先度は最も低くなります。

私がテストしようとしているのはこのルールです。

そこで、94 ページの Josh の一連の考えをたどろうとしました。彼は externalbindings.scala というソース ファイルを作成し、以下のようにいくつかの変更を加えて同じことを行いました。

package com.att.scala

class extbindings {
  def showX(x: Int): Int = {
    x
  }

  object x1 {
    override def toString = "Externally bound obj object in com.att.scala"
  }
}

次に、上記のルールをテストできる別のファイルを作成するように依頼されました。precedence.scala というファイルを作成しました。

package com.att.scala

class PrecedenceTest { //Josh has an object here instead of a class

  def testPrecedence(): Unit = { //Josh has main method instead of this
    testSamePackage()
    //testWildCardImport()
    //testExplicitImport()
    //testInlineDefinition()
  }

  println("First statement of Constructor")
  testPrecedence
  println("Last statement of Constructor")

  def testSamePackage() {
    val ext1 = new extbindings()
    val x = ext1.showX(100)
    println("x is "+x)
    println(obj1) // Eclipse complains here
  }
}

これで Josh は<package-name>.<object-name>.testSamePackage、REPL でメソッドを実行するだけで、彼の例のオブジェクトの値を出力できるようになりました。彼の出力は次のとおりです。

パッケージ テストで外部的にバインドされた x オブジェクト

私のバージョンでは、ファイルは Eclipse にあり、組み込みの Scala インタープリターがあります。

Eclipseはここで不平を言います: println(obj)、それは言います:not found value obj1

テストファイルの設定で明らかに間違ったことをしていますか? 上記のルールをテストして、出力を取得できるようにしたいと思います。

パッケージ com.att.scala 内の外部バインドされた obj オブジェクト

4

2 に答える 2

4

私はその本を読んでいないので、あなたのコードが本が伝えたいことを示しているかどうかはよくわかりません。

それにもかかわらず、エラー メッセージは正しいです。obj1存在しないので見つかりません。あなたのコードでは、それは呼ばれていx1ます。のメンバーであるためextbindings、このクラスのメンバーとしてアクセスする必要があります。

println(ext1.x1)

x1が class の外部で定義されている場合extbinding、 package のスコープ内で、com.att.scala直接アクセスできます。

println(x1)

別のパッケージで定義されている場合は、パッケージ名を前に置く必要があります。

println(com.att.scala2.x1)

インポートできるいくつかのことを簡素化するためにx1

import ext1.x1
println(x1)

最後に、コードを改善するためのヒント: name types in UpperCamelCase: extbindings-> Extbindings, x1->X1

于 2012-07-25T15:52:44.393 に答える
3

シングルトン オブジェクトをクラスに置き換える場合は、そのクラスのインスタンスを作成する必要があります。

于 2012-07-25T15:56:26.607 に答える