ความแตกต่างระหว่างการใช้ลักษณะของแอปและวิธีการหลักในสกาล่า


87

อะไรคือความแตกต่างระหว่าง

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

และ

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


1
ในกรณีของงาน Apache Spark เอกสารระบุ "ว่าแอปพลิเคชันควรกำหนดเมธอด main () แทนการขยาย scala.App คลาสย่อยของ scala.App อาจทำงานไม่ถูกต้อง"
leo9r

คำตอบ:


64

ลักษณะของแอปเป็นวิธีที่สะดวกในการสร้างโปรแกรมสกาลาที่ทำงานได้ ความแตกต่างของวิธีการอัลเทนเนทีฟหลักคือ (นอกเหนือจากความแตกต่างทางวากยสัมพันธ์ที่เห็นได้ชัด) ที่ลักษณะของแอพใช้คุณสมบัติการทำให้เกิดความล่าช้า

จากบันทึกประจำรุ่นสำหรับ 2.9 (ดูhttp://www.scala-lang.org/old/node/9483 )

ออบเจ็กต์ที่สืบทอดลักษณะแอปแทนที่จะใช้คุณลักษณะการเริ่มต้นล่าช้าของ Scala 2.9 เพื่อดำเนินการทั้งร่างกายโดยเป็นส่วนหนึ่งของวิธีการหลักที่สืบทอดมา

คุณสมบัติใหม่อีกอย่างของ App Scheme คือตอนนี้อาร์กิวเมนต์บรรทัดคำสั่งสามารถเข้าถึงได้ผ่านค่า args (ซึ่งสืบทอดมาจาก trait App)


ฉันเข้าใจถูกหรือไม่ว่าหากไม่มีประโยชน์จากลักษณะของแอปวัตถุ (แอปพลิเคชัน) นี้จะไม่ทำหน้าที่เหมือนวัตถุสกาลาอื่น ๆ เนื่องจากจุดเข้าใช้งานเป็นmainวิธีการและร่างกายไม่ได้ดำเนินการตามที่คาดไว้ มีการดำเนินการเลยหรือไม่หลังจากเข้าสู่ main?
Richard Sitze

@RichardSitze มีmainวิธีการหนึ่งในAppลักษณะที่แม่มดผสมอยู่ในApplicationวัตถุของคุณ ไม่มีเวทมนตร์ใดเกิดขึ้นนอกเหนือจากข้อเท็จจริงที่ว่าการเริ่มต้นล่าช้าคือสิ่งที่ดำเนินการกับร่างกายของApplicationวัตถุของคุณ
Emil H

4

สองกรณีนี้ไม่เหมือนกันในการเขียนสคริปต์สกาล่า

object extends Appไม่ได้ดำเนินการโดยscala MyObject.scalaคำสั่ง "" แต่อ็อบเจ็กต์ที่มีเมธอดหลักถูกดำเนินการโดยscala MyObject.scalaคำสั่ง "" ซึ่งอธิบายว่าสกาลากำลังมองหาวัตถุด้วยวิธีการหลักในการเขียนสคริปต์

เมื่อใช้ REPL หรือ scala workseet ของ Eclipse จำเป็นต้องเรียกMyObject.main(Array[String]())อย่างชัดเจนสำหรับทั้งสองกรณี

เคล็ดลับง่ายๆนี้เป็นประโยชน์สำหรับผู้เริ่มต้นอย่างฉัน


0

คุณลักษณะของแอปถูกนำไปใช้โดยใช้ฟังก์ชัน [[DelayedInit]] ซึ่งหมายความว่าช่องของวัตถุจะไม่ได้รับการเตรียมใช้งานก่อนที่วิธีการหลักจะถูกเรียกใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.