ฉันพบสิ่งต่อไปนี้ในโค้ด Scala:
class MyClass { ... val a = new A; import a._ }
val a = new A; import a._
หมายถึงอะไรกันแน่?
ฉันพบสิ่งต่อไปนี้ในโค้ด Scala:
class MyClass { ... val a = new A; import a._ }
val a = new A; import a._
หมายถึงอะไรกันแน่?
มันนำเข้าวิธีการและตัวแปรของวัตถุ ดังนั้นหากคุณต้องการโทร a.foo()
คุณสามารถโทร foo()
แทนได้
หมายความว่าวิธีการและตัวแปรทั้งหมดของวัตถุ a
ประเภท A
มีอยู่ในบล็อกนี้ (ขอบเขต) โดยไม่ต้องกล่าวถึง a
อย่างชัดเจน ดังนั้นหาก A
มีเมธอด bar()
คุณสามารถพูดได้ว่า:
bar()
แทน
a.bar()
แต่ภายในขอบเขตที่กำหนด import
เท่านั้น
มาอธิบายเรื่องนี้ด้วยสิ่งที่คุณควรทำความคุ้นเคย:
println("Hello world")
คำถามคือ: ทำไมมันถึงได้ผล? ไม่มีวัตถุที่เรียกว่า println
ด้วยวิธีการ apply
ซึ่งเป็นคำอธิบายปกติสำหรับโค้ดที่มีลักษณะเช่นนั้น เมื่อมันเกิดขึ้น โค้ดด้านบนกำลังทำสิ่งนี้จริงๆ:
Predef.println("Hello world")
กล่าวอีกนัยหนึ่ง println
เป็นวิธีการบนวัตถุ scala.Predef
แล้วคุณจะใช้มันเหมือนข้างบนได้อย่างไร? เช่นนี้:
import scala.Predef._
println("Hello world")
การนำเข้าเนื้อหาของ การอ้างอิงที่มีเสถียรภาพ (เช่น ไม่ใช่ var
หรือ def
) จะทำให้วิธีการต่างๆ ใช้งานได้โดยไม่ต้องขึ้นต้นด้วย reference.
นอกจากนี้ยังทำให้มีการกำหนดนัยภายในไว้ด้วย ซึ่งเป็นวิธีการทำให้การแปลงโดยนัยที่กำหนดไว้ภายใน scala.Predef
พร้อมใช้งานเช่นกัน -- Scala นำเข้าเนื้อหาของ java.lang
, scala
และ scala.Predef
(ตามลำดับ ดังนั้นรายการหลังจะแทนที่รายการก่อนหน้า) .