类 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)); }