11.3.6. Метод const_missing

We use cookies. Read the Privacy and Cookie Policy

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"

Данный текст является ознакомительным фрагментом.