스칼라에서 앱 특성과 주요 방법 사용의 차이점


87

차이점은 무엇입니까

object Application extends App {
   println("Hello World")
}

object Application {
    def main(args: Array[String]): Unit = {
        println("Hello World");
    }
}


1
Apache Spark 작업의 경우 문서에 "응용 프로그램은 scala.App을 확장하는 대신 main () 메서드를 정의해야합니다. scala.App의 하위 클래스가 제대로 작동하지 않을 수 있습니다."라고 명시되어 있습니다.
leo9r

답변:


64

앱 특성은 실행 가능한 스칼라 프로그램을 만드는 편리한 방법입니다. 주요 방법 대체 방법과의 차이점은 앱 특성이 지연된 초기화 기능을 사용한다는 것입니다 (명백한 구문 차이는 제외).

2.9 릴리스 노트에서 ( http://www.scala-lang.org/old/node/9483 참조 )

App 특성을 상속하는 개체는 대신 Scala 2.9의 지연된 초기화 기능을 사용하여 상속 된 기본 메서드의 일부로 전체 본문을 실행합니다.

앱 체계의 또 다른 새로운 기능은 이제 args 값 (특성 앱에서 상 속됨)을 통해 명령 줄 인수에 액세스 할 수 있다는 것입니다.


App 특성의 이점이 없으면이 (Application) 개체가 다른 스칼라 개체처럼 작동 하지 않는다는 점을 이해하고 있습니까? 진입 점이 main메서드이고 본문이 예상대로 실행되지 않는다는 점에서 그렇습니다 . 메인에 진입 한 후 어느 시점에서 실행됩니까?
리처드 Sitze

@RichardSitze있다 main의 방법 App당신에 대한 특성 마녀 GET의 혼합의 Application목적은. 지연된 초기화가 Application객체 의 본문을 실행한다는 사실을 넘어서는 마술은 없습니다 .
Emil H

4

이 두 경우는 스칼라 스크립팅에서 동일하지 않습니다.

object extends App" scala MyObject.scala"명령에 의해 실행되지 않았지만 main 메서드가 포함 된 개체 가 " scala MyObject.scala"명령에 의해 실행되었습니다 . 스크립팅의 주요 방법으로 객체를 찾는 스칼라로 설명되었습니다.

Eclipse의 REPL 또는 scala workseet MyObject.main(Array[String]())를 사용하는 경우 두 경우 모두 명시 적으로 호출해야합니다 .

이 간단한 팁은 저와 같은 초보자에게 도움이됩니다.


0

앱 트레이 트는 [[DelayedInit]] 기능을 사용하여 구현됩니다. 즉, 기본 메서드가 실행되기 전에 개체의 필드가 초기화되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.