Может сказать мне ruby, если данный класс был определен в данном модуле - PullRequest
1 голос
/ 18 сентября 2009
Module M
    Class C
    end
end

Мне нужно что-то вроде:

M.was_defined_here?(M::C)
M.classes.include?(M::C)

Это как-то существует?

Я знаю, что могу разобрать M :: C.name. Но у кого-то может возникнуть идея изменить имя модуля #, сделать его более астетическим или что-то подобное. Я хочу чистое решение.

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009
M.constants.map {|c| M.const_get(c)}.include?(M::C)

Или, из комментария Йоханнеса, использование find (будет работать лучше, если класс существует в M и не является последней константой в M - хотя это редко должно иметь измеримое значение):

M.constants.find {|c| M.const_get(c) == M::C }

Редактировать: Поскольку вы на самом деле просто хотите получить логический результат, этот any? отправляет больше, чем find:

M.constants.any? {|c| M.const_get(c) == M::C }
2 голосов
/ 18 сентября 2009

ответ sepp2k не будет работать, если M::C вообще не определено, так как Ruby поднимет NameError в этом блоке.

Попробуйте это:

M.constants.include?('C')

Если вы беспокоитесь, что у вас есть ссылка на M::C под другим именем, например:

module M
  class C
  end
end

MY_M_C = M::C

, тогда вы можете проверить, является ли MY_M_C таким же, как M C, например:

M.constants.include?('C') ? MY_M_C == M.const_get(:C) : false 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...