जवाबों:
मुझे लगता है कि रूबी 1.9 में आप ऐसा कर सकते हैं:
class A
define_singleton_method :loudly do |message|
puts message.upcase
end
end
A.loudly "my message"
# >> MY MESSAGE
singleton_class.define_method :loudly do |message|
आदि?
मैं डिस्क्रिप्शन टू कॉल डिफाइन_मिथोड का उपयोग करना पसंद करता हूं, और मुझे मेटाक्लास तक पहुंचने के लिए एक मेटाक्लस विधि बनाना भी पसंद है:
class Object
def metaclass
class << self
self
end
end
end
class MyClass
# Defines MyClass.my_method
self.metaclass.send(:define_method, :my_method) do
...
end
end
metaclass
, इसलिए आसान, स्टैंडअलोन शॉर्टहैंड जानना अच्छा है।
रूबी 1.8+ में यह सबसे सरल तरीका है:
class A
class << self
def method_name
...
end
end
end
से व्युत्पन्न: जे और क्यों , जो इस प्रिटियर को बनाने के तरीके भी प्रदान करते हैं।
self.create_class_method(method_name)
(class << self; self; end).instance_eval do
define_method method_name do
...
end
end
end
अद्यतन : नीचे वीआर के योगदान से; एक अधिक संक्षिप्त विधि (जब तक आप केवल एक विधि को इस तरह परिभाषित कर रहे हैं) जो अभी भी स्टैंडअलोन है:
self.create_class_method(method_name)
(class << self; self; end).send(:define_method, method_name) do
...
end
end
लेकिन ध्यान दें कि डिफरेंशियल मेथड्स जैसे डिफेंस_मिथोड () एक्सेस करने के लिए सेंड () का उपयोग करना जरूरी नहीं है कि यह एक अच्छा आइडिया है (मेरी समझ से यह रूबी 1.9 में दूर हो रहा है)।
रेल में इस्तेमाल किया जा सकता है अगर आप चिंता से गतिशील रूप से वर्ग विधियों को परिभाषित करना चाहते हैं:
module Concerns::Testable
extend ActiveSupport::Concern
included do
singleton_class.instance_eval do
define_method(:test) do
puts 'test'
end
end
end
end
singleton_class.define_method