บทความนี้อธิบายการโหลดอัตโนมัติของคลาสและโมดูลใน Ruby รวมอัญมณี “Zeitwerk” ใหม่ซึ่งเป็นส่วนหนึ่งของ Rails 6
มาเริ่มกันที่คำถาม…
เราจะรวมไฟล์ซอร์สโค้ดหลายไฟล์เป็นไฟล์เดียวได้อย่างไร
เรา require
เหล่านั้น
การต้องการไฟล์ทำให้ Ruby อ่านและเรียกใช้โค้ดข้างใน แต่ถ้าเรามีรายการไฟล์ที่จำเป็น เราอาจไม่จำเป็นต้องโหลดทั้งหมด .
อย่างน้อยก็ไม่ทัน…
เราจะโหลดไฟล์ได้อย่างไร เมื่อเราต้องการเท่านั้น เพื่อให้เราเริ่มสมัครได้เร็วขึ้น?
นั่นคือที่มาของการโหลดอัตโนมัติ!
วิธีใช้การโหลดอัตโนมัติ
Ruby มีคุณสมบัติการโหลดอัตโนมัติในตัว
มันขึ้นอยู่กับค่าคงที่
เมื่อค่าคงที่เหมือน Coconut
พบครั้งแรก Ruby จะพยายามโหลดไฟล์ที่เกี่ยวข้อง
แต่ก่อน :
คุณต้องลงทะเบียนค่าคงที่นี้ด้วยชื่อไฟล์
ถูกใจสิ่งนี้ :
autoload :Coconut, "lib/coconut.rb"
ตอนนี้ Ruby รู้ว่าจะดูที่ไหนเมื่อใดก็ตามที่คุณต้องการใช้ Coconut
คลาสหรือโมดูล
แต่คุณรู้ไหมว่าอะไรจะดีไปกว่านี้?
ลองนึกภาพถ้าคุณไม่ต้องลงทะเบียนค่าคงที่ด้วยตนเอง &Ruby รู้ว่าจะหาทุกอย่างได้ที่ไหน
ก็…
นี่คือสิ่งที่ Rails ทำ แต่ก่อนหน้า Rails 6 ไม่ได้ใช้ autoload
นี้ กลไก
การโหลดอัตโนมัติใน Rails ก่อน Rails 6
ฉันไม่เข้าใจว่ามันทำงานอย่างไร แต่ Rails ใช้ const_missing
แทนที่จะเป็น autoload
เพื่อค้นหาและโหลดไฟล์ลงในโปรเจ็กต์ของคุณโดยอัตโนมัติ
เหตุใดจึงมีประโยชน์
เพราะมันหมายความว่าคุณไม่จำเป็นต้องใช้ require
ในโครงการ Rails ของคุณ
อนุสัญญาเกี่ยวกับการกำหนดค่า…
ทุกอย่างเกิดขึ้นโดยอัตโนมัติโดยที่คุณทำตามกฎ
กฎคือ :
- วางไฟล์ของคุณในที่ที่สามารถพบได้ (ตามที่กำหนดโดย
ActiveSupport::Dependencies.autoload_paths
) - กำหนดหนึ่งคลาส / โมดูลต่อไฟล์
- ตั้งชื่อไฟล์ตามชื่อคลาส โดยใช้เครื่องหมายขีดล่าง (
UsersController
=>users_controller
)
แล้ว…
เมื่อใดก็ตามที่รหัสของคุณอ้างอิงชื่อคลาสเหล่านี้ Rails จะรู้ว่าจะหาได้จากที่ไหน
มีประโยชน์มาก
การโหลดอัตโนมัติใน Rails หลังจาก Rails 6
Rails 6 นำเสนอกลไกการโหลดอัตโนมัติแบบใหม่อย่างต่อเนื่อง
เรียกว่า Zeitwerk
ต่างจากการโหลดอัตโนมัติ Rails แบบ “คลาสสิก” อย่างไร
ไม่เหมือนกับ const_missing
แนวทางที่ใช้โดย Rails เวอร์ชันเก่าซึ่งไม่มีข้อมูล เช่น การซ้อนโมดูล ส่งผลให้เกิดข้อจำกัดหลายประการ
Zeitwerk ใช้ autoload
ของ Ruby .
การใช้งานใหม่นี้เป็นไปตามหลักการตั้งชื่อไฟล์ที่คล้ายคลึงกัน
อันที่จริง :
Zeitwerk ใช้ชื่อไฟล์เพื่อสรุปชื่อคลาส users_controller
=> UsersController
.
ซึ่งตรงกันข้ามกับเมื่อก่อนเลย
อีกอย่าง คุณยังคงใช้ autoload_paths
. ได้ แต่คุณต้องการเพิ่มเฉพาะพาธ BASE เช่น "/lib"
, แทนที่จะเป็น "/lib/**"
.
ทำไม?
นี่คือวิธีการทำงานกับเนมสเปซและการซ้อน
- ถ้าคุณมี
"lib"
ใน autoload และคุณต้องการกำหนด"Fruit::Orange"
ดังนั้นชื่อไฟล์จะต้องเป็น"lib/fruit/orange.rb"
. - แต่ถ้าคุณมี
"lib/fruit"
ในการโหลดอัตโนมัติ คุณจะต้องใช้โฟลเดอร์อื่น ดังนั้นชื่อไฟล์ของคุณจึงกลายเป็น"lib/fruit/fruit/orange.rb"
สำหรับคลาสเดียวกัน
ส่วนที่ดีที่สุด?
ฟังก์ชันใหม่นี้ไม่ได้ติดอยู่กับ Rails คุณจึงใช้ฟีเจอร์นี้ในโปรเจ็กต์ที่ไม่ใช่ Rails ได้
สรุป
คุณได้เรียนรู้เกี่ยวกับการโหลดโมดูลอัตโนมัติใน Ruby แล้ว มันคืออะไรและทำงานอย่างไร!
ด้วยความเข้าใจใหม่นี้ คุณจะสามารถจัดโครงสร้างโปรเจ็กต์ Ruby ของคุณได้อย่างมีประสิทธิภาพสูงสุด
ถึงตาคุณแล้ว เปิดเครื่องมือแก้ไขและสนุกไปกับมัน
ขอบคุณที่อ่าน! 🙂