สิ่งสำคัญที่ต้องเข้าใจคือไม่มีวิธีการเรียนใน Ruby
วิธีการเรียนเป็นเพียงวิธีการเดี่ยว ไม่มีอะไรพิเศษเกี่ยวกับวิธีการเรียน ทุกวัตถุสามารถมีวิธีการเดี่ยว เราเพิ่งเรียกพวกเขาว่า "วิธีการเรียน" เมื่อวัตถุเป็นClass
เพราะ "วิธีการเดี่ยวของตัวอย่างClass
" ยาวเกินไปและเทอะทะ
รอ! ฉันพูดว่า "วิธีการเดี่ยว"?
อีกสิ่งที่สำคัญที่ต้องเข้าใจคือไม่มีวิธีเช่นเดียวกับใน Ruby
วิธีการแบบซิงเกิลเป็นเพียงวิธีแบบเก่าที่น่าเบื่อแบบธรรมดาของคลาสซิงเกิล ไม่มีอะไรพิเศษเกี่ยวกับวิธีการแบบซิงเกิล พวกมันเป็นเพียงแค่วิธีการเช่นเดียวกับวิธีอื่น ๆ
ในความเป็นจริง Ruby มีวิธีการอินสแตนซ์เท่านั้น ไม่มีฟังก์ชั่นไม่มีตัวสร้างไม่มีวิธีการคงที่ไม่มีวิธีการเรียนไม่มีฟังก์ชั่นโมดูลไม่มีวิธีการเดี่ยว
คำถามไม่ใช่ "นี่เป็นวิธีการเรียนหรือไม่นี่เป็นวิธีการแบบซิงเกิล" แต่เป็น "วิธีการที่โมดูลนี้กำหนดไว้ใช่หรือไม่"
"วิธี Singleton" เป็นวิธีการอินสแตนซ์ที่กำหนดไว้ในคลาส singleton ไวยากรณ์สำหรับการเข้าถึงคลาส singleton foo
คือ
class << foo
end
นอกจากนี้ยังมีวิธีการObject#singleton_class
ที่ส่งกลับชั้นเดียวของวัตถุ
เหตุใดฉันจึงใช้ความพยายามอย่างจริงจังเกี่ยวกับความจริงที่ว่าทุกวิธีเป็นวิธีการแบบอินสแตนซ์และวิธีการเรียนแบบนั้นไม่มีอยู่จริง? เพราะมันหมายความว่าแบบจำลองวัตถุของรูบี้นั้นง่ายกว่าที่คิด! ท้ายที่สุดในคำถามของคุณคุณได้แสดงให้เห็นแล้วว่าคุณรู้วิธีการตั้งชื่อแทนวิธีการอินสแตนซ์ แต่คุณบอกว่าคุณไม่ทราบวิธีใช้นามแฝงวิธีการเรียน แต่นั่นเป็นสิ่งที่ผิด! คุณไม่ทราบวิธีการวิธีการเรียนนามแฝงเพราะพวกเขามีวิธีการเช่นเพียง หากคุณได้รับการสอนข้อเท็จจริงนี้อย่างถูกต้องคุณจะไม่ต้องถามคำถามนี้เลย!
เมื่อคุณเข้าใจว่าทุกวิธีเป็นวิธีการแบบอินสแตนซ์และสิ่งที่เราเรียกว่า "วิธีการแบบซิงเกิล" เป็นเพียงวิธีการแบบอินสแตนซ์ของคลาสซิงเกิลการแก้ปัญหาจะกลายเป็นชัดเจน:
singleton_class.alias_method :a_new_class_method, :a_class_method
หมายเหตุ: เมื่อฉันเขียนข้างต้นว่า "ไม่มีสิ่งเช่น X" สิ่งที่ฉันหมายถึงคือ "ไม่มีสิ่งเช่น X ในภาษา Ruby " แต่นั่นไม่ได้หมายความว่าแนวคิดเหล่านี้ไม่ได้มีอยู่ในชุมชนทับทิม
เรามักพูดถึง "วิธีการแบบซิงเกิล" และ "วิธีการแบบชั้นเรียน" เพียงเพราะมันง่ายกว่าการพูดถึง "วิธีแบบอินสแตนซ์ของคลาสแบบซิงเกิล" หรือ "วิธีแบบอินสแตนซ์ของคลาสแบบเดี่ยวของวัตถุที่เกิดขึ้นเป็นตัวอย่างของClass
ชั้นเรียน " มีวิธีการชอบมีObject#define_singleton_method
, Object#singleton_method
, Object#singleton_methods
, Module#private_class_method
, Module#public_class_method
และModule#module_function
ในห้องสมุดหลักทับทิม แต่สิ่งสำคัญคือต้องจำไว้เสมอว่าสิ่งเหล่านั้นไม่ใช่แนวคิดทางภาษา เหล่านี้คือแนวคิดชุมชนที่มีอยู่ในหัวของเราและในชื่อของวิธีการห้องสมุดบางอย่าง
extend ClassMethods
แก้ปัญหา +1