3

私はScalaが初めてです。コンパニオン オブジェクトがコンパニオン クラスのメソッドにアクセスできることを読みました。次のコードがあります。

class MinPath {
  def minPath(input : List[List[Int]], tempResult : List[List[Int]], currentlevel : Int) : List[List[Int]] = {
    ....
  }
}

object MinPath {
  ....
  def main(args : Array[String]) = {
    // This has an compile error
    val transformed =  minPath(input, List(List()), 0)
  }
}

これらは、MinPath.scala という名前の同じファイルで定義されています。

ただし、オブジェクトで使用される minPath は、minPath を見つけることができないため、コンパイル エラーを引き起こします。

私はここで何が間違っていたのだろうか?

4

3 に答える 3

6

無関係なインスタンスの作成を回避する、この一般的なパターンについて誰も言及していません。

scala> :pa
// Entering paste mode (ctrl-D to finish)

class Foo {
  def foo= 8
}
object Foo extends Foo {
  def main(args : Array[String]) = {
    Console println foo
  }
}

// Exiting paste mode, now interpreting.

defined class Foo
defined object Foo

scala> Foo main null
8

どうやら、それはプライベートでも機能しますfooが、これは私には明らかではありませんでした。つまり、プライベート アクセス権を持つクラスを拡張する場合、その中のプライベート シンボルは、修飾またはインポートなしでアクセスできます。

scala> :pa
// Entering paste mode (ctrl-D to finish)

class Foo {
  private def foo= 8
}
object Foo extends Foo {
  def main(args : Array[String]) = {
    Console println foo
  }
}

// Exiting paste mode, now interpreting.

defined class Foo
defined object Foo

scala> Foo main null
8
于 2013-09-05T20:37:18.960 に答える
2

メソッドでは、 class のインスタンスmainを呼び出す必要があります。したがって、最初にインスタンスを作成する必要があります。minPathMinPath

object MinPath {
  def main(args: Array[String]) {
    // Create an instance
    val instance = new MinPath

    // Call the method on the instance
    val transformed = instance.minPath(input, List(List()), 0)
  }
}
于 2013-09-05T19:44:57.087 に答える
1

コンパニオン オブジェクトがコンパニオン クラスのメソッドにアクセスできることを読みました。

これが意味することは、アクセス レベルでminPath宣言された場合でも、そのメソッドにアクセスできるということです。scala コンパイラーは、他のクラスがそれにアクセスすることを許可しません。protectedobject MinPath

現在、デフォルトの public アクセス レベルがあるため、ここではアクセス レベルは問題になりません。

AlexIv が指摘しているclass MinPathように、メソッドを使用するには のインスタンスも作成する必要があります。

val mp = new MinPath
val transformed = mp.minPath(input, List(List()), 0)
于 2013-09-05T19:32:56.027 に答える