класс Thread::Backtrace::Location
Объектное представление кадра стека, инициализированного Kernel#caller_locations.
Например:
# caller_locations.rb def a(skip) caller_locations(skip) end def b(skip) a(skip) end def c(skip) b(skip) end c(0..2).map do |call| puts call.to_s end
Выполнение ruby caller_locations.rb приведет к:
caller_locations.rb:2:in `a' caller_locations.rb:5:in `b' caller_locations.rb:8:in `c'
Вот еще один пример с немного другим результатом:
# foo.rb
class Foo
attr_accessor :locations
def initialize(skip)
@locations = caller_locations(skip)
end
end
Foo.new(0..2).locations.map do |call|
puts call.to_s
end
Теперь выполните ruby foo.rb и вы должны увидеть:
init.rb:4:in `initialize' init.rb:8:in `new' init.rb:8:in `<main>'
Общедоступные методы экземпляра
static VALUE
location_absolute_path_m(VALUE self)
{
return location_realpath(location_ptr(self));
} Возвращает полный путь к файлу этого кадра.
То же, что и path, за исключением того, что он вернет абсолютный путь, даже если кадр находится в основном скрипте.
static VALUE
location_base_label_m(VALUE self)
{
return location_base_label(location_ptr(self));
} Возвращает базовую метку этого кадра.
Обычно совпадает с label, без декораций.
static VALUE
location_inspect_m(VALUE self)
{
return rb_str_inspect(location_to_str(location_ptr(self)));
} Возвращает то же, что и вызов inspect для строкового представления to_str
static VALUE
location_label_m(VALUE self)
{
return location_label(location_ptr(self));
} Возвращает метку этого кадра.
Обычно состоит из имен методов, классов, модулей и т.д. с декорациями.
Рассмотрим следующий пример:
def foo
puts caller_locations(0).first.label
1.times do
puts caller_locations(0).first.label
1.times do
puts caller_locations(0).first.label
end
end
end
Результат вызова foo следующий:
label: foo label: block in foo label: block (2 levels) in foo
static VALUE
location_lineno_m(VALUE self)
{
return INT2FIX(location_lineno(location_ptr(self)));
} Возвращает номер строки этого кадра.
Например, используя caller_locations.rb из Thread::Backtrace::Location
loc = c(0..1).first loc.lineno #=> 2
static VALUE
location_path_m(VALUE self)
{
const rb_iseq_t *iseq = location_iseq(location_ptr(self));
return iseq ? rb_iseq_path(iseq) : Qnil;
} Возвращает имя файла этого кадра. Обычно это абсолютный путь, за исключением случаев, когда кадр находится в основном скрипте, в этом случае возвращается путь к скрипту, переданному в командной строке.
Например, используя caller_locations.rb из Thread::Backtrace::Location
loc = c(0..1).first loc.path #=> caller_locations.rb
static VALUE
location_to_str_m(VALUE self)
{
return location_to_str(location_ptr(self));
} Возвращает строку в стиле Kernel#caller, представляющую этот кадр.
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.