บทความนี้อธิบายการโหลดอัตโนมัติของคลาสและโมดูลใน 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 ของคุณได้อย่างมีประสิทธิภาพสูงสุด
ถึงตาคุณแล้ว เปิดเครื่องมือแก้ไขและสนุกไปกับมัน
ขอบคุณที่อ่าน! 🙂