Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
def meth(n) sum = 0 for i in 1..n sum += i end sumendset_trace_func(proc do |event, file, line, id, binding, klass, *rest| printf "%8s %s:%d %s/%sn", event, file, line, klass, id end)meth(2)Отметим, что здесь соблюдается стандартное соглашение о заключении многострочного блока в операторные скобки
do-endВот что будет напечатано в результате выполнения этого кода:
line prog.rb:13 false/ call prog.rb:1 Object/meth line prog.rb:2 Object/meth line prog.rb:3 Object/meth c-call prog.rb:3 Range/each line prog.rb:4 Object/meth c-call prog.rb:4 Fixnum/+c-return prog.rb:4 Fixnum/+ line prog.rb:4 Object/meth c-call prog.rb:4 Fixnum/+c-return prog.rb:4 Fixnum/+c-return prog.rb:4 Range/each line prog.rb:6 Object/meth return prog.rb:6 Object/methС этим методом тесно связан метод
Kernel#trace_varПредположим, что вам нужно извне протрассировать выполнение программы в целях отладки. Проще всего воспользоваться для этого библиотекой
tracerprog.rbdef meth(n) (1..n).each {|i| puts i}endmeth(3)Можно запустить
tracer% ruby -r tracer prog.rb#0:prog.rb:1::-: def meth(n)#0:prog.rb:1:Module:>: def meth(n)#0:prog.rb:1:Module:<: def meth(n)#0:prog.rb:8::-: meth(2)#0:prog.rb:1:Object:>: def meth(n)#0:prog.rb:2:Object:-: sum = 0#0:prog.rb:3:Object:-: for i in 1..n#0:prog.rb:3:Range:>: for i in 1..n#0:prog.rb:4:Object:-: sum += i#0:prog.rb:4:Fixnum:>: sum += i#0:prog.rb:4:Fixnum:<: sum += i#0:prog.rb:4:Object:-: sum += i#0:prog.rb:4:Fixnum:>: sum += i#0:prog.rb:4:Fixnum:<: sum += i#0:prog.rb:4:Range:<: sum += i#0:prog.rb:6:Object:-: sum#0:prog.rb:6:Object:<: sumПрограмма
tracer'-''>''<''С''Е'RUBYOPT11.3.11. Обход пространства объектов
Система исполнения Ruby должна отслеживать все известные объекты (хотя бы для того, чтобы убрать мусор, когда на объект больше нет ссылок). Информацию о них можно получить с помощью метода
ObjectSpace.each_objectObjectSpace.each_object do |obj| printf "%20s: %sn", obj.class, obj.inspectendЕсли задать класс или модуль в качестве параметра
each_objectМодуль Object Space полезен также для определения чистильщиков объектов (см. раздел 11.3.14).
11.3.12. Обработка вызовов несуществующих методов
Иногда бывают полезны классы, отвечающие на вызовы произвольных методов. Например, для того чтобы обернуть обращения к внешним программам в класс, который представляет каждое такое обращение как вызов метода. Заранее имена всех программ вы не знаете, поэтому написать определения всех методов при создании класса не получится. На помощь приходит метод
Object#method_missingmethod_missingclass CommandWrapper def method_missing(method, *args) system (method.to_s, *args) endendcw = CommandWrapper.newcw.date # Sat Apr 28 22:50:11 CDT 2001cw.du '-s', '/tmp' # 166749 /tmpПервый параметр метода
method_missingЕсли написанная вами реализация
method_missingsupermethod_missingmethod_missingObject
