Відповіді:
Я думаю, що в Ruby 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|
тощо?
Я вважаю за краще використовувати send to call define_method, і мені також подобається створити метод метакласу для доступу до метакласу:
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
, тому приємно знати просту окрему стенограму.
Це найпростіший спосіб у Ruby 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
Оновлення : зі вкладу VR нижче; більш стислий метод (якщо ви таким чином визначаєте лише один метод), який все ще є самостійним:
self.create_class_method(method_name)
(class << self; self; end).send(:define_method, method_name) do
...
end
end
але зауважте, що використання send () для доступу до приватних методів, таких як define_method (), не обов'язково є гарною ідеєю (я розумію, що це відбувається в Ruby 1.9).
Для використання в Rails, якщо ви хочете динамічно визначати методи класу з боку концерну:
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