Как динамически определить метод класса, который будет ссылаться на локальную переменную снаружи?

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 может создать метод экземпляра без создания новой области, но моя точка зрения заключается в том, как определить метод класса .

23
задан Smar 3 February 2015 в 14:26
поделиться

1 ответ

На самом деле в 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
55
ответ дан 29 November 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: