我是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。
我想知道我在这里做错了什么?
答案 0 :(得分:5)
没有人提到这种常见的模式,它避免了创建一个无关的实例:
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
答案 1 :(得分:2)
在main
方法中,您必须在类minPath
的实例上调用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)
}
}
答案 2 :(得分:1)
我读到伴侣对象可以访问伴侣类的方法。
这意味着,如果使用minPath
访问级别声明protected
,object MinPath
仍然可以访问该方法。 scala编译器不允许其他类访问它。
目前,它具有默认的公共访问级别,因此访问级别不是问题所在。
正如AlexIv指出的那样,您还需要创建class MinPath
的实例才能使用该方法。
val mp = new MinPath
val transformed = mp.minPath(input, List(List()), 0)