Scala 如何在嵌套对象中调用main方法?

Scala 如何在嵌套对象中调用main方法?,scala,Scala,以下代码在对象A和A.B中具有主要方法。我可以从命令行调用A。有没有办法调用A.B object A { def main(args : Array[String]) = () object B { def main(args : Array[String]) = () } } 我认为最令人高兴的是:Scala将对象A编译成类A$,将A.B编译成A$B$。这两个类都没有静态方法。Scala使用静态main方法创建了一个附加类A,该方法委托给A$.main

以下代码在对象
A
A.B
中具有主要方法。我可以从命令行调用
A
。有没有办法调用
A.B

object A {
    def main(args : Array[String]) = ()
    object B {
        def main(args : Array[String]) = ()
    }
}
我认为最令人高兴的是:Scala将对象
A
编译成类
A$
,将
A.B
编译成
A$B$
。这两个类都没有静态方法。Scala使用静态main方法创建了一个附加类
A
,该方法委托给
A$.main
。但是Scala并没有为
A.B
编译一个等价的类,因为编译器使用main方法对顶级类进行了特殊处理


如果上述描述正确,则无法在命令行上调用
A.B
。它是?如果是这样的话,那么这个实现有什么原因吗?

那么,正如您所注意到的,
对象a{…}
最终成为一个类
a$
,而不是
a
,它有一个
main
方法,但它不是静态的。 Scala对象是单例实例,而不仅仅是带有一系列静态方法的类

因此,为了能够从命令行运行
scala A
,scalac生成另一个类
A
,该类使用静态方法
main
,调用
A$.MODULE$.main

这是一种特殊的额外逻辑,需要符合jvm的假设,即当从命令行启动时如何查找
main

编译器只对具有
main
方法且没有伴生类的顶级对象执行此操作(因为如果有伴生类,则名称将与生成的类冲突)


为什么不对嵌套类执行此操作?我不认为有什么理由特别阻止它(就像我上面提到的名字冲突),可能只是因为没有人要求它

因此,正如您所注意到的,
对象A{…}
最终成为类
A$
,而不是
A
,它有一个
main
方法,但它不是静态的。 Scala对象是单例实例,而不仅仅是带有一系列静态方法的类

因此,为了能够从命令行运行
scala A
,scalac生成另一个类
A
,该类使用静态方法
main
,调用
A$.MODULE$.main

这是一种特殊的额外逻辑,需要符合jvm的假设,即当从命令行启动时如何查找
main

编译器只对具有
main
方法且没有伴生类的顶级对象执行此操作(因为如果有伴生类,则名称将与生成的类冲突)


为什么不对嵌套类执行此操作?我不认为有什么理由特别阻止它(就像我上面提到的名字冲突),可能只是因为没有人要求它

从外部看不到内部对象B。要调用其主方法,必须在中提供接口(例如从其主方法),以便无需进一步ado即可传递参数:

object A {

    def main(args : Array[String]) = {
        println ("outer A.main")
        B.main (args)
    }

    object B {
        def main(args : Array[String]) = {
            println ("inner B.main")
        }
    }
}
调用:

scala -howtorun:object A
outer A.main
inner B.main
测试:


从外部看不到内部对象B。要调用其主方法,必须在中提供接口(例如从其主方法),以便无需进一步ado即可传递参数:

object A {

    def main(args : Array[String]) = {
        println ("outer A.main")
        B.main (args)
    }

    object B {
        def main(args : Array[String]) = {
            println ("inner B.main")
        }
    }
}
调用:

scala -howtorun:object A
outer A.main
inner B.main
测试:


对该实现的原因是没有人需要它:)如果您想运行
B.main
,只需将其移动到顶层,或创建另一个对象,或使
A.main
运行即可it@Dima除了没有人需要它,还有其他原因吗?有很多没人需要的东西。在这种情况下,Scala的行为似乎不一致。有人为一组
对象雕刻了一个特殊的盒子。听起来这种特殊情况一定有原因:可能是实现这一功能更广泛的技术问题?当你不需要某些东西时,通常没有理由。你现在需要空汽水瓶吗?为什么不不需要某样东西就是没有理由拥有它。有一个明显的原因,就是要有某种方法从命令行运行scala程序。没有理由以人们可以想象的方式运行它。这不是“特例”。一个顶级对象,另一个嵌套。FWIW,您也不能在java中执行嵌套类。@Dima好的,很公平,如果执行嵌套对象被视为额外的,我理解为什么它没有实现。如果你发布一个答案,我会接受。顺便说一句,您可以在Java.Hm中执行静态内部类,实际上您可以。。。我不知道(25年java经验):染料。该实现的原因是没有人需要它:)如果您想运行
B.main
,只需将其移动到顶层,或创建另一个对象,或使
A.main
运行即可it@Dima除了没有人需要它,还有其他原因吗?有很多没人需要的东西。在这种情况下,Scala的行为似乎不一致。有人为一组
对象雕刻了一个特殊的盒子。听起来这种特殊情况一定有原因:可能是实现这一功能更广泛的技术问题?当你不需要某些东西时,通常没有理由。你现在需要空汽水瓶吗?为什么不不需要某样东西就是没有理由拥有它。有一个明显的原因,就是要有某种方法从命令行运行scala程序。没有理由以人们可以想象的方式运行它。这不是“特例”。一个顶级对象,另一个嵌套。FWIW,您也不能在java中执行嵌套类。@Dima好的,很公平,如果执行嵌套对象被视为额外的,我理解为什么它没有实现。如果你发布一个答案,我会接受。顺便说一句,您可以在Java.Hm中执行静态内部类,实际上您可以。。。我不知道(25年java经验):D