Spec-Zone.ru › Ruby 3.2

class Thread::Backtrace::Location

Parent:
Объект

Объектное представление кадра стека, инициализированное методом 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>'

Публичные методы экземпляра

absolute_path() Показать исходный код
static VALUE
location_absolute_path_m(VALUE self)
{
    return location_realpath(location_ptr(self));
}

Возвращает полный путь к файлу данного кадра.

Аналогично path, но возвращает абсолютный путь, даже если кадр находится в основном скрипте.

base_label() Показать исходный код
static VALUE
location_base_label_m(VALUE self)
{
    return location_base_label(location_ptr(self));
}

Возвращает базовое имя метки данного кадра.

Обычно совпадает с label, без декораций.

inspect() Показать исходный код
static VALUE
location_inspect_m(VALUE self)
{
    return rb_str_inspect(location_to_str(location_ptr(self)));
}

Возвращает то же, что и вызов inspect на строковом представлении to_str

label() Показать исходный код
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
lineno() Показать исходный код
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
path() Показать исходный код
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
to_s() Показать исходный код
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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API