Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
def const_missing(name) Roman.decode(name) endendyear1 = MCMLCCIV # 1974year2 = MMVIII # 2008Если такая глобальность вам не нужна, определите этот метод на уровне конкретного класса. Тогда он будет вызываться из этого класса и его потомков.
class Alpha def self.const_missing(sym) "В Alpha нет #{sym}" endendclass Beta def self.const_missing(sym) "В Beta нет #{sym}." endendclass A < Alphaendclass В < Betaendp Alpha::FOO # "В Alpha нет FOO"p Beta::FOO # "В Beta нет FOO"p A::FOO # "В Alpha нет FOO"p В::FOO # "В Beta нет FOO"11.3.7. Удаление определений
Вследствие динамичности Ruby практически все, что можно определить, можно и уничтожить. Это может пригодиться, например, для того, чтобы «развязать» два куска кода в одной и той же области действия, избавляясь от переменных после того, как они были использованы. Другой повод — запретить вызовы некоторых потенциально опасных методов. Но по какой бы причине вы ни удаляли определение, делать это нужно крайне осторожно, чтобы не создать себе проблемы во время отладки.
Радикальный способ уничтожить определение — воспользоваться ключевым словом
undefdefdef asbestos puts "Теперь не огнеопасно"endtax =0.08PI = 3asbestosputs "PI=#{PI}, tax=#{tax}"undef asbestosundef taxundef PI# Любое обращение к этим трем именам теперь приведет к ошибке.Внутри определения класса можно уничтожать определения методов и констант в том же контексте, в котором они были определены. Нельзя применять
undefСуществуют (определены в классе
Moduleremove_methodundef_methodundef_methodclass Parent def alpha puts "alpha: родитель" end def beta puts "beta: родитель" endendclass Child < Parent def alpha puts "alpha: потомок" end def beta puts "beta: потомок" end remove_method :alpha # Удалить "этот" alpha. undef_method :beta # Удалить все beta.endx = Child.newx.alpha # alpha: родительx.beta # Ошибка!Метод
remove_constmodule Mathremove_const :PI end# PI больше нет!Отметим, что таким способом можно удалить и определение класса (потому что идентификатор класса — это просто константа):
class BriefCandle #...endout_out = BriefCandle.newclass Object remove_const :BriefCandleend# Создать еще один экземпляр класса BriefCandle не получится!# (Хотя out_out все еще существует...)Такие методы, как
remove_constremove_method11.3.8. Получение списка определенных сущностей
API отражения в Ruby позволяет опрашивать классы и объекты во время выполнения. Рассмотрим методы, имеющиеся для этой цели в
ModuleClassObject
