Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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
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
class Object
remove_const :BriefCandle
end
# Создать еще один экземпляр класса BriefCandle не получится!
# (Хотя out_out все еще существует...)
Такие методы, как
remove_const
remove_method
11.3.8. Получение списка определенных сущностей
API отражения в Ruby позволяет опрашивать классы и объекты во время выполнения. Рассмотрим методы, имеющиеся для этой цели в
Module
Class
Object