Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
def meth(n)
sum = 0
for i in 1..n
sum += i
end
sum
end
set_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
Предположим, что вам нужно извне протрассировать выполнение программы в целях отладки. Проще всего воспользоваться для этого библиотекой
tracer
prog.rb
def meth(n)
(1..n).each {|i| puts i}
end
meth(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
'-'
'>'
'<'
'С'
'Е'
RUBYOPT
11.3.11. Обход пространства объектов
Система исполнения Ruby должна отслеживать все известные объекты (хотя бы для того, чтобы убрать мусор, когда на объект больше нет ссылок). Информацию о них можно получить с помощью метода
ObjectSpace.each_object
ObjectSpace.each_object do |obj|
printf "%20s: %sn", obj.class, obj.inspect
end
Если задать класс или модуль в качестве параметра
each_object
Модуль Object Space полезен также для определения чистильщиков объектов (см. раздел 11.3.14).
11.3.12. Обработка вызовов несуществующих методов
Иногда бывают полезны классы, отвечающие на вызовы произвольных методов. Например, для того чтобы обернуть обращения к внешним программам в класс, который представляет каждое такое обращение как вызов метода. Заранее имена всех программ вы не знаете, поэтому написать определения всех методов при создании класса не получится. На помощь приходит метод
Object#method_missing
method_missing
class CommandWrapper
def method_missing(method, *args)
system (method.to_s, *args)
end
end
cw = CommandWrapper.new
cw.date # Sat Apr 28 22:50:11 CDT 2001
cw.du '-s', '/tmp' # 166749 /tmp
Первый параметр метода
method_missing
Если написанная вами реализация
method_missing
super
method_missing
method_missing
Object