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

在该main方法中,您必须调用minPathclass 的实例MinPath。所以你需要先创建一个实例:

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声明了protected访问级别,object MinPath仍然可以访问该方法。scala 编译器不允许其他类访问它。

目前,它具有默认的公共访问级别,因此访问级别不是这里的问题。

正如 AlexIv 指出的那样,您还需要创建一个实例class MinPath才能使用该方法。

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