類別 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>'

公開實例方法

absolute_path() 按一下以切換來源

傳回此框架的完整檔案路徑。

path 相同,但即使框架在主程式中,也會傳回絕對路徑。

static VALUE
location_absolute_path_m(VALUE self)
{
    return location_realpath(location_ptr(self));
}
base_label() 按一下以切換來源

傳回此框架的基本標籤。

通常與 label 相同,沒有裝飾。

static VALUE
location_base_label_m(VALUE self)
{
    return location_base_label(location_ptr(self));
}
inspect() 按一下以切換來源

傳回與對 to_str 的字串表示法呼叫 inspect 相同的結果

static VALUE
location_inspect_m(VALUE self)
{
    return rb_str_inspect(location_to_str(location_ptr(self)));
}
label() 按一下以切換來源

傳回此框架的標籤。

通常包含方法、類別、模組等名稱,並加上裝飾。

考慮以下範例

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_label_m(VALUE self)
{
    return location_label(location_ptr(self));
}
lineno() 按一下以切換來源

傳回此框架的行號。

例如,使用 Thread::Backtrace::Location 中的 caller_locations.rb

loc = c(0..1).first
loc.lineno #=> 2
static VALUE
location_lineno_m(VALUE self)
{
    return INT2FIX(location_lineno(location_ptr(self)));
}
path() 按一下以切換來源

傳回此框架的檔案名稱。這通常會是絕對路徑,除非框架在主程式中,這種情況下,它會是命令列中傳遞的程式碼位置。

例如,使用 Thread::Backtrace::Location 中的 caller_locations.rb

loc = c(0..1).first
loc.path #=> caller_locations.rb
static VALUE
location_path_m(VALUE self)
{
    const rb_iseq_t *iseq = location_iseq(location_ptr(self));
    return iseq ? rb_iseq_path(iseq) : Qnil;
}
to_s() 按一下以切換來源

傳回表示此框架的 Kernel#caller 樣式字串。

static VALUE
location_to_str_m(VALUE self)
{
    return location_to_str(location_ptr(self));
}