Ruby 4.1 リファレンスマニュアル

class Thread::Backtrace::Location

[edit]

要約

Ruby のフレームを表すクラスです。

Kernel?.caller_locations から生成されます。

例1
# 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
例1の実行結果
caller_locations.rb:2:in 'a'
caller_locations.rb:5:in 'b'
caller_locations.rb:8:in 'c'
例2
# 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
例2の実行結果
init.rb:4:in 'initialize'
init.rb:8:in 'new'
init.rb:8:in '<main>'

参考

目次

インスタンスメソッド

インスタンスメソッド

absolute_path -> StringRuby 2.0.0 から[permalink][rdoc][edit]
() → String?

self が表すフレームの絶対パスを返します。

例
# 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.absolute_path
end

# => /path/to/foo.rb
# /path/to/foo.rb
# /path/to/foo.rb

[SEE_ALSO] Thread::Backtrace::Location#path

base_label -> StringRuby 2.0.0 から[permalink][rdoc][edit]
() → String?

self が表すフレームの基本ラベルを返します。通常、 Thread::Backtrace::Location#label から修飾を取り除いたもので構成されます。

例
# 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.base_label
end

# => initialize
# new
# <main>

[SEE_ALSO] Thread::Backtrace::Location#label

inspect -> StringRuby 2.0.0 から[permalink][rdoc][edit]

Thread::Backtrace::Location#to_s の結果を人間が読みやすいような文字列に変換したオブジェクトを返します。

例
# 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.inspect
end

# => "path/to/foo.rb:5:in 'initialize'"
# "path/to/foo.rb:9:in 'new'"
# "path/to/foo.rb:9:in '<main>'"
label -> StringRuby 2.0.0 から[permalink][rdoc][edit]
() → String?

self が表すフレームのラベルを返します。通常、メソッド名、クラス名、モジュール名などで構成されます。

例: Thread::Backtrace::Location の例1を用いた例

loc = c(0..1).first
p loc.label # => "a"

[SEE_ALSO] Thread::Backtrace::Location#base_label

lineno -> IntegerRuby 2.0.0 から[permalink][rdoc][edit]
() → Integer

self が表すフレームの行番号を返します。

例: Thread::Backtrace::Location の例1を用いた例

loc = c(0..1).first
p loc.lineno # => 2
path -> StringRuby 2.0.0 から[permalink][rdoc][edit]
() → String?

self が表すフレームのファイル名を返します。

例: Thread::Backtrace::Location の例1を用いた例

loc = c(0..1).first
p loc.path # => "caller_locations.rb"

[SEE_ALSO] Thread::Backtrace::Location#absolute_path

source_range -> Ruby::SourceRangeRuby 4.1 から[permalink][rdoc][edit]

self が表すフレームに対応する Ruby の式の Ruby::SourceRange を返します。

CRuby では、このメソッドは呼び出されるたびにソースファイルを再度読み込んでパースし直すことで範囲を求めます。読み込みで発生したファイルのエラー(存在しないファイルに対する Errno::ENOENT など)はそのまま発生します。

RubyVM.keep_script_lines = true を指定すると、ソースファイルをメモリ上に保持し、ファイルシステムからの再読み込みを避けられます。eval したコードのフレームでは、RubyVM.keep_script_lines = true を指定していないと範囲を取得できません。

[EXCEPTION] RuntimeError:
ソースが変更されているなど、範囲を求めるために必要な情報が得られない場合に発生します。
[EXCEPTION] ArgumentError:
eval したコードのフレームで、RubyVM.keep_script_lines = true を指定していない場合に発生します。
例
loc = caller_locations(0, 1)[0]
range = loc.source_range
p range.path == loc.path         # => true
p range.start_line == loc.lineno # => true

[SEE_ALSO] Thread::Backtrace::Location#syntax_tree, Proc#source_range

syntax_tree -> Prism::Node | RubyVM::AbstractSyntaxTree::Node | nilRuby 4.1 から[permalink][rdoc][edit]

self が表すフレームに対応する抽象構文木(AST)のノードを、ソースファイルを再度パースし直すことで返します。

ノードを確実に取得できない場合に nil を返す条件については RubyVM::InstructionSequence#syntax_tree を参照してください。

このメソッドは実験的なもので、予告なく変更される可能性があります。

例
node = -> { caller_locations(0, 1)[0] }.call.syntax_tree
p node.is_a?(Prism::CallNode) # => true
p node.name                   # => :caller_locations

[SEE_ALSO] Thread::Backtrace::Location#source_range, RubyVM::InstructionSequence#syntax_tree

to_s -> StringRuby 2.0.0 から[permalink][rdoc][edit]

self が表すフレームを Kernel?.caller と同じ表現にした文字列を返します。

例
# 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

# => path/to/foo.rb:5:in 'initialize'
# path/to/foo.rb:9:in 'new'
# path/to/foo.rb:9:in '<main>'