Metaprogramming Basics
Define Method
define_method creates a method from a block.
define method
`define_method` is useful when several methods follow a shared pattern.
Define Method
define_method.rb
Replay: real traced execution (multi-file project)
suffix = "!"
formatter_class = Class.new do
define_method(:decorate) do |text|
"#{text}#{suffix}"
end
end
formatter = formatter_class.new
message = formatter.decorate("Ruby")
puts "suffix=#{suffix}"
puts "message=#{message}"
suffix = "?"
formatter_class = Class.new do
define_method(:decorate) do |text|
"#{text}#{suffix}"
end
end
formatter = formatter_class.new
message = formatter.decorate("Ruby")
puts "suffix=#{suffix}"
puts "message=#{message}"
suffix = "."
formatter_class = Class.new do
define_method(:decorate) do |text|
"#{text}#{suffix}"
end
end
formatter = formatter_class.new
message = formatter.decorate("Ruby")
puts "suffix=#{suffix}"
puts "message=#{message}"
suffix ← !
1suffix→ ! = "!" #@suffix="?", "."2formatter_class = Class.new do3 define_method(:decorate) do |text|4 "#{text}#{suffix}"5 end6endformatter_class ← ⟨Class A⟩
1suffix = "!" #@suffix="?", "."2formatter_class→ ⟨Class A⟩ = Class.new do3 define_method(:decorate) do |text|4 "#{text}#{suffix}"5 end6endformatter ← #<⟨Class A⟩:⟨addr B⟩>, message ← Ruby!
8formatter→ #<⟨Class A⟩:⟨addr B⟩> = formatter_class⟨Class A⟩.new9message→ Ruby! = formatter.decorate("Ruby")Ruby!1011puts "suffix=#{suffix!}"12puts "message=#{messageRuby!}"outputsuffix=! message=Ruby!
suffix ← ?
1suffix→ ? = "?"2formatter_class = Class.new do3 define_method(:decorate) do |text|4 "#{text}#{suffix}"5 end6endformatter_class ← ⟨Class A⟩
1suffix = "?"2formatter_class→ ⟨Class A⟩ = Class.new do3 define_method(:decorate) do |text|4 "#{text}#{suffix}"5 end6endformatter ← #<⟨Class A⟩:⟨addr B⟩>, message ← Ruby?
8formatter→ #<⟨Class A⟩:⟨addr B⟩> = formatter_class⟨Class A⟩.new9message→ Ruby? = formatter.decorate("Ruby")Ruby?1011puts "suffix=#{suffix?}"12puts "message=#{messageRuby?}"outputsuffix=? message=Ruby?
suffix ← .
1suffix→ . = "."2formatter_class = Class.new do3 define_method(:decorate) do |text|4 "#{text}#{suffix}"5 end6endformatter_class ← ⟨Class A⟩
1suffix = "."2formatter_class→ ⟨Class A⟩ = Class.new do3 define_method(:decorate) do |text|4 "#{text}#{suffix}"5 end6endformatter ← #<⟨Class A⟩:⟨addr B⟩>, message ← Ruby.
8formatter→ #<⟨Class A⟩:⟨addr B⟩> = formatter_class⟨Class A⟩.new9message→ Ruby. = formatter.decorate("Ruby")Ruby.1011puts "suffix=#{suffix.}"12puts "message=#{messageRuby.}"outputsuffix=. message=Ruby.