class C
end
var = "I am a local var outside"
C.class_eval do
def self.a_class_method
puts var
end
end
Я знаю, это не правильно, потому что def
создал новую область видимости.
Я также знаю, что использование define_method
может создать метод экземпляра без создания новой области, но моя точка зрения заключается в том, как определить метод класса .
На самом деле в Ruby не существует методов класса, это всего лишь одноэлементные методы объекта класса. Одноэлементных методов тоже не существует, это просто обычные методы экземпляра одноэлементного класса объекта.
Поскольку вы уже знаете, как определять методы экземпляра (используя Module # define_method
), вы уже знаете все, что вам нужно знать. Вам просто нужно вызвать class_eval
в одноэлементном классе C
вместо самого C
:
(class << C; self end).class_eval do
define_method(:a_class_method) do
puts var
end
end
Текущие версии Ruby имеют singleton_class
], чтобы упростить задачу:
C.singleton_class.class_eval do
define_method(:a_class_method) do
puts var
end
end
Но на самом деле текущие версии Ruby также имеют Module #define_singleton_method
, так что в данном конкретном случае это не нужно:
C.define_singleton_method(:a_class_method) do
puts var
end