Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

Zeitwerk &โมดูลโหลดอัตโนมัติใน Ruby (อธิบายอย่างชัดเจน)

บทความนี้อธิบายการโหลดอัตโนมัติของคลาสและโมดูลใน 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 ของคุณ

อนุสัญญาเกี่ยวกับการกำหนดค่า…

ทุกอย่างเกิดขึ้นโดยอัตโนมัติโดยที่คุณทำตามกฎ

กฎคือ :

  1. วางไฟล์ของคุณในที่ที่สามารถพบได้ (ตามที่กำหนดโดย ActiveSupport::Dependencies.autoload_paths )
  2. กำหนดหนึ่งคลาส / โมดูลต่อไฟล์
  3. ตั้งชื่อไฟล์ตามชื่อคลาส โดยใช้เครื่องหมายขีดล่าง (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 ของคุณได้อย่างมีประสิทธิภาพสูงสุด

ถึงตาคุณแล้ว เปิดเครื่องมือแก้ไขและสนุกไปกับมัน

ขอบคุณที่อ่าน! 🙂