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

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

Жанры

Программирование на языке 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

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

Оборотни. Естественный отбор.

Петров Артем Дмитриевич
1. Оборотни
Фантастика:
фэнтези
6.64
рейтинг книги
Оборотни. Естественный отбор.

Незабудки для тебя

Робертс Нора
Любовные романы:
остросюжетные любовные романы
8.65
рейтинг книги
Незабудки для тебя

Песнь для Арбонны. Последний свет Солнца

Кей Гай Гэвриел
Фантастика:
фэнтези
5.00
рейтинг книги
Песнь для Арбонны. Последний свет Солнца

Деяние XII

Виноградов Павел Владимирович
Приключения:
прочие приключения
5.00
рейтинг книги
Деяние XII

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.50
рейтинг книги
Дважды одаренный. Том VI

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Ваше Сиятельство

Завещание предков

Стрелков Владислав Валентинович
Приключения:
исторические приключения
6.14
рейтинг книги
Завещание предков

Зеленоглазая авантюристка

Одувалова Анна Сергеевна
1. Зеленоглазая авантюристка
Фантастика:
юмористическая фантастика
8.64
рейтинг книги
Зеленоглазая авантюристка

Венецианский контракт

Фьорато Марина
Любовные романы:
исторические любовные романы
5.60
рейтинг книги
Венецианский контракт

Рубин Рафаэля

Хэгер Диана
Ключи от тайн
Любовные романы:
исторические любовные романы
5.00
рейтинг книги
Рубин Рафаэля

Казаки в Персии 1909-1918

Стрелянов П. Н.
Научно-образовательная:
военная история
5.00
рейтинг книги
Казаки в Персии 1909-1918

Линия судьбы

Сойер Мерил
Любовные романы:
современные любовные романы
9.31
рейтинг книги
Линия судьбы

Поцелуй небес

Арсеньева Ольга
Любовные романы:
современные любовные романы
5.20
рейтинг книги
Поцелуй небес