Ruby objects can report information about their classes and methods.

introspection Introspection means asking code about its own shape, such as which methods a class defines.

Introspection

prefix
introspection.rb
Replay: real traced execution (multi-file project)
class Calculator
  def add
    "add"
  end

  def subtract
    "subtract"
  end
end

prefix = "a"
methods = Calculator.public_instance_methods(false).map(&:to_s).sort
matches = methods.select { |method_name| method_name.start_with?(prefix) }
matches_text = matches.join("/")

puts "class=#{Calculator.name}"
puts "prefix=#{prefix}"
puts "matches=#{matches_text}"
puts "count=#{matches.length}"
class Calculator
  def add
    "add"
  end

  def subtract
    "subtract"
  end
end

prefix = "s"
methods = Calculator.public_instance_methods(false).map(&:to_s).sort
matches = methods.select { |method_name| method_name.start_with?(prefix) }
matches_text = matches.join("/")

puts "class=#{Calculator.name}"
puts "prefix=#{prefix}"
puts "matches=#{matches_text}"
puts "count=#{matches.length}"
class Calculator
  def add
    "add"
  end

  def subtract
    "subtract"
  end
end

prefix = "m"
methods = Calculator.public_instance_methods(false).map(&:to_s).sort
matches = methods.select { |method_name| method_name.start_with?(prefix) }
matches_text = matches.join("/")

puts "class=#{Calculator.name}"
puts "prefix=#{prefix}"
puts "matches=#{matches_text}"
puts "count=#{matches.length}"
  1. prefix ← a, methods ← ["add", "subtract"], matches ← ["add"], matches_text ← add

    11prefix→ a = "a"  #@prefix="s", "m"12methods→ ["add", "subtract"] = Calculator.public_instance_methods(false).map(&:to_s).sort["add", "subtract"]13matches→ ["add"] = methods["add", "subtract"].select { |method_name| method_name.start_with?(prefix) }14matches_text→ add = matches.join("/")add1516puts "class=#{Calculator.nameCalculator}"17puts "prefix=#{prefixa}"18puts "matches=#{matches_textadd}"19puts "count=#{matches.length1}"
    outputclass=Calculator
    prefix=a
    matches=add
    count=1
  1. prefix ← s, methods ← ["add", "subtract"], matches ← ["subtract"]

    11prefix→ s = "s"12methods→ ["add", "subtract"] = Calculator.public_instance_methods(false).map(&:to_s).sort["add", "subtract"]13matches→ ["subtract"] = methods["add", "subtract"].select { |method_name| method_name.start_with?(prefix) }14matches_text→ subtract = matches.join("/")subtract1516puts "class=#{Calculator.nameCalculator}"17puts "prefix=#{prefixs}"18puts "matches=#{matches_textsubtract}"19puts "count=#{matches.length1}"
    outputclass=Calculator
    prefix=s
    matches=subtract
    count=1
  1. prefix ← m, methods ← ["add", "subtract"], matches ← [], matches_text ← (empty)

    11prefix→ m = "m"12methods→ ["add", "subtract"] = Calculator.public_instance_methods(false).map(&:to_s).sort["add", "subtract"]13matches→ [] = methods["add", "subtract"].select { |method_name| method_name.start_with?(prefix) }14matches_text→ (empty) = matches.join("/")(empty)1516puts "class=#{Calculator.nameCalculator}"17puts "prefix=#{prefixm}"18puts "matches=#{matches_text(empty)}"19puts "count=#{matches.length0}"
    outputclass=Calculator
    prefix=m
    matches=
    count=0