Scala App val 在 main 方法中初始化

发布于 2025-01-01 08:53:34 字数 270 浏览 1 评论 0原文

我有一些代码:

object Main extends App
{
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r

    override def main (args:Array[String])
    {
        // Why is NameTemplate null here?
    }
}

为什么 NameTemplate 未在主方法中初始化?

I have some code:

object Main extends App
{
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r

    override def main (args:Array[String])
    {
        // Why is NameTemplate null here?
    }
}

Why is NameTemplate not initialized within the main method?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼睛会笑 2025-01-08 08:53:34

如果您使用 App 特征,则无需重写 main 方法 - 只需在 对象 主体中编写代码即可:

object Main extends App {
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r

    println(NameTemplate)

    val NameTemplate(name, version) = args(0)

    println(name + " v" + version)

}

它之所以有效,是因为 App 特征扩展了 DelayedInit 特征具有非常特殊的初始化过程。您甚至可以使用 args 访问参数,如示例所示。

如果您不想扩展 App,您仍然需要编写 main 方法,但在这种情况下它将按预期工作:

object Main {
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r

    def main(args: Array[String]) {
        println(NameTemplate)

        val NameTemplate(name, version) = args(0)

        println(name + " v" + version)
    }

}

If you are using App trait, then you don't need to override main method - just write your code in the body of the object:

object Main extends App {
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r

    println(NameTemplate)

    val NameTemplate(name, version) = args(0)

    println(name + " v" + version)

}

It works because App trait extends DelayedInit trait which has very special initialization procedure. You can even access arguments with args, as shown in the example.

You still need to write main method if you don't want to extend App, but in this case it will work as expected:

object Main {
    val NameTemplate = """^([A-Za-z]+)_(\d+)\.png""".r

    def main(args: Array[String]) {
        println(NameTemplate)

        val NameTemplate(name, version) = args(0)

        println(name + " v" + version)
    }

}
三人与歌 2025-01-08 08:53:34

DelayedInit 特征(App 扩展)导致重写初始化代码以在特殊的 delayedInit() 方法中执行。这通常会由 main 调用。然而,由于您要覆盖 main,因此 delayedInit() 代码永远不会被调用,因此您的值不会被初始化。

正如 @tenshi 所解释的,您可以通过不扩展 App 或将主代码移动到 Main 对象的主体中来解决此问题。

The DelayedInit trait (which App extends) causes rewriting of intialisation code to execute within a special delayedInit() method. This would then normally be invoked by main. Since you are overriding main, however, the delayedInit() code is never being invoked, and as such your value is not being initialised.

As @tenshi explains, you can get around this either by not extending App or by moving your main code into the body of your Main object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文