class 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));
} Возвращает базовую метку этого кадра, которая обычно равна метке без декораций.
Рассмотрим следующий пример:
def foo
puts caller_locations(0).first.base_label
1.times do
puts caller_locations(0).first.base_label
1.times do
puts caller_locations(0).first.base_label
end
end
end
Результат вызова foo следующий:
foo foo foo
Исходный код
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 следующий:
foo block in foo 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–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.