Điều quan trọng cần hiểu là không có thứ gọi là phương thức lớp trong Ruby.
Một phương thức lớp thực sự chỉ là một phương thức đơn lẻ. Không có gì đặc biệt về các phương thức lớp. Mọi đối tượng có thể có các phương thức singleton. Chúng tôi chỉ gọi chúng là "phương thức lớp" khi đối tượng là Class
vì "phương thức singleton của một thể hiện Class
" quá dài và khó sử dụng.
Chờ đợi! Tôi đã nói "phương pháp singleton"?
Một điều quan trọng khác để hiểu là không có phương pháp đơn lẻ nào trong Ruby.
Một phương thức singleton thực sự chỉ là một phương thức cũ nhàm chán thông thường của lớp singleton. Không có gì đặc biệt về các phương pháp singleton. Chúng chỉ là các phương thức cá thể như bất kỳ phương thức cá thể nào khác.
Trong thực tế, Ruby chỉ có các phương thức cá thể. Không có hàm, không có hàm tạo, không có phương thức tĩnh, không có phương thức lớp, không có hàm mô-đun, không có phương thức singleton.
Câu hỏi không phải là "đây có phải là một phương thức lớp không, đây có phải là một phương thức đơn lẻ" không, mà là " phương thức này được định nghĩa trong mô-đun nào?"
"Các phương thức Singleton" là các phương thức thực sự được định nghĩa trong lớp singleton. Cú pháp để truy cập lớp singleton foo
là
class << foo
end
Ngoài ra còn có một phương thức Object#singleton_class
trả về lớp singleton của một đối tượng.
Tại sao tôi lại quyết liệt tập trung vào thực tế rằng mọi phương thức là một phương thức cá thể và các phương thức lớp đó không tồn tại? Bởi vì điều đó có nghĩa là mô hình đối tượng của Ruby đơn giản hơn nhiều so với mọi người nghĩ! Rốt cuộc, trong câu hỏi của bạn, bạn đã chỉ ra rằng bạn biết cách đặt bí danh cho các phương thức cá thể, nhưng bạn nói rằng bạn không biết làm thế nào để bí danh các phương thức lớp. Nhưng, đó là sai! Bạn làm biết làm thế nào để phương pháp lớp học bí danh, vì họ chỉ là phương pháp dụ . Nếu bạn đã được dạy thực tế này đúng cách, bạn sẽ không bao giờ cần phải hỏi câu hỏi này!
Khi bạn hiểu rằng mọi phương thức là một phương thức cá thể và rằng cái mà chúng ta gọi là "phương thức singleton" chỉ là phương thức cá thể của lớp singleton, giải pháp trở nên rõ ràng:
singleton_class.alias_method :a_new_class_method, :a_class_method
Lưu ý: khi tôi viết ở trên rằng "không có thứ gọi là X", ý tôi là "không có thứ X như ngôn ngữ Ruby ". Điều đó không có nghĩa là những khái niệm đó không tồn tại trong cộng đồng Ruby .
Chúng ta thường nói về "phương thức singleton" và "phương thức lớp", đơn giản vì nó dễ hơn nói về "phương thức cá thể của lớp singleton" hoặc "phương thức cá thể của lớp singleton của một đối tượng xảy ra là một thể hiện của Class
lớp ". Có nhiều phương pháp thậm chí như Object#define_singleton_method
, Object#singleton_method
, Object#singleton_methods
, Module#private_class_method
, Module#public_class_method
, và Module#module_function
trong thư viện lõi Ruby. Nhưng điều quan trọng cần nhớ là đó không phải là khái niệm ngôn ngữ. Đó là những khái niệm cộng đồng chỉ tồn tại trong đầu chúng ta và trong tên của một số phương thức thư viện.
extend ClassMethods
giải pháp. +1