Как определить класс без оператора 'класса' в Ruby? - PullRequest
4 голосов
/ 22 февраля 2010

У меня много классов для определения, но я не хочу повторять следующую работу:

class A < ActiveRecord::Base
end

Есть ли оператор объявления для определения класса без использования оператора class?

Ответы [ 4 ]

7 голосов
/ 22 февраля 2010

Если вы заранее точно знаете, какие классы необходимо определить, вам, вероятно, следует сгенерировать код, который явно определяет их с ключевым словом class для ясности.

Однако, если вам действительно нужно определить их динамически, вы можете использовать Object.const_set в сочетании с Class.new. Чтобы определить пару дочерних классов ActiveRecord::Base:

%w{A B C D}.each do |name|
  Object.const_set name, Class.new(ActiveRecord::Base)
end

Результатом вышеупомянутого является четыре новых класса с именем A..D, все дети ActiveRecord::Base.

5 голосов
/ 22 февраля 2010

Вероятно, это лучше сделать с помощью макросов или скриптов в вашем текстовом редакторе. Создание классов программно затрудняет их документирование.

3 голосов
/ 22 февраля 2010

Вы можете определить классы полностью динамически:

A = Class.new(ActiveRecord::Base) do
  # this block is evaluated in the new class' context, so you can:
  # - call class methods like #has_many
  # - define methods using #define_method
end
0 голосов
/ 24 февраля 2010

Я думаю, у "Metaprogramming ruby" есть вопрос о том, как избежать использования ключевого слова class, но я не уверен, поможет ли это вам решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...