Книга: Программирование на языке Ruby

11.3.6. Метод const_missing

11.3.6. Метод const_missing

Метод const_missing аналогичен методу method_missing. При попытке обратиться к неизвестной константе вызывается этот метод — если он, конечно, определен. В качестве параметра ему передается символ, ссылающийся на константу.

Чтобы перехватывать обращения к отсутствующим константам глобально, определите следующий метод в самом классе Module (это родитель класса Class).

class Module
 def const_missing(x)
  "Из Module"
 end
end
class X
end
p X::BAR     # "Из Module"
p BAR        # "Из Module"
p Array::BAR # "Из Module"

Можно выполнить в нем любые действия: вернуть фиктивное значение константы, вычислить его и т.д. Помните класс Roman из главы 6? Воспользуемся им, чтобы трактовать любые последовательности римских цифр как числовые константы:

class Module
 def const_missing(name)
  Roman.decode(name)
 end
end
year1 = MCMLCCIV # 1974
year2 = MMVIII   # 2008

Если такая глобальность вам не нужна, определите этот метод на уровне конкретного класса. Тогда он будет вызываться из этого класса и его потомков.

class Alpha
 def self.const_missing(sym)
  "В Alpha нет #{sym}"
 end
end
class Beta
 def self.const_missing(sym)
  "В Beta нет #{sym}."
 end
end
class A < Alpha
end
class В < Beta
end
p Alpha::FOO # "В Alpha нет FOO"
p Beta::FOO  # "В Beta нет FOO"
p A::FOO     # "В Alpha нет FOO"
p В::FOO     # "В Beta нет FOO"

Оглавление книги


Генерация: 1.174. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз