Metaprogramming Basics
Introspection
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
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}"
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
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
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