Чтение онлайн

на главную - закладки

Жанры

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

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

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"

11.3.7. Удаление определений

Вследствие динамичности Ruby практически все, что можно определить, можно и уничтожить. Это может пригодиться, например, для того, чтобы «развязать» два куска кода в одной и той же области действия, избавляясь от переменных после того, как они были использованы. Другой повод — запретить вызовы некоторых потенциально опасных методов. Но по какой бы причине вы ни удаляли определение, делать это нужно крайне осторожно, чтобы не создать себе проблемы во время отладки.

Радикальный способ уничтожить определение — воспользоваться ключевым словом

undef
(неудивительно, что его действие противоположно действию
def
). Уничтожать можно определения методов, локальных переменных и констант на верхнем уровне. Хотя имя класса — тоже константа, удалить определение класса таким способом невозможно.

def asbestos

 puts "Теперь не огнеопасно"

end

tax =0.08

PI = 3

asbestos

puts "PI=#{PI}, tax=#{tax}"

undef asbestos

undef tax

undef PI

# Любое обращение к этим трем именам теперь приведет к ошибке.

Внутри определения класса можно уничтожать определения методов и констант в том же контексте, в котором они были определены. Нельзя применять

undef
внутри определения метода, а также к переменной экземпляра.

Существуют (определены в классе

Module
) также методы
remove_method
и
undef_method
. Разница между ними тонкая: remove_method удаляет текущее (или ближайшее) определение метода, a
undef_method
ко всему прочему удаляет его и из суперклассов, не оставляя от метода даже следа. Это различие иллюстрирует листинг 11.6.

Листинг 11.16. Методы remove_method и undef_method

class Parent

 def alpha

puts "alpha: родитель"

 end

 def beta

puts "beta: родитель"

 end

end

class Child < Parent

 def alpha

puts "alpha: потомок"

 end

 def beta

puts "beta: потомок"

 end

 remove_method :alpha # Удалить "этот" alpha.

 undef_method :beta # Удалить все beta.

end

x = Child.new

x.alpha # alpha: родитель

x.beta # Ошибка!

Метод

remove_const
удаляет константу.

module Math

remove_const :PI

 end

# PI больше нет!

Отметим, что таким способом можно удалить и определение класса (потому что идентификатор класса — это просто константа):

class BriefCandle

 #...

end

out_out = BriefCandle.new

Поделиться:
Популярные книги

Сапер. Том IV

Вязовский Алексей
4. Сапер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сапер. Том IV

Дорогами алхимии

Видум Инди
2. Под знаком Песца
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Дорогами алхимии

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Темные тропы и светлые дела

Владимиров Денис
3. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Темные тропы и светлые дела

Хозяин Стужи 2

Петров Максим Николаевич
2. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Хозяин Стужи 2

Эпоха Опустошителя. Том II

Павлов Вел
2. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том II

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Полигон

Гостева Ирина
S.T.A.L.K.E.R.
Фантастика:
боевая фантастика
7.78
рейтинг книги
Полигон

Законы Рода. Том 4

Мельник Андрей
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 4

Князь Целитель 6

Ткачев Андрей Юрьевич
6. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Целитель 6

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

На границе империй. Том 7. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4