define_method creates a method from a block.

define method `define_method` is useful when several methods follow a shared pattern.

Define Method

suffix
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}"
  1. suffix ← !

    1suffix→ ! = "!"  #@suffix="?", "."2formatter_class = Class.new do3  define_method(:decorate) do |text|4    "#{text}#{suffix}"5  end6end
  2. formatter_class ← ⟨Class A⟩

    1suffix = "!"  #@suffix="?", "."2formatter_class→ ⟨Class A⟩ = Class.new do3  define_method(:decorate) do |text|4    "#{text}#{suffix}"5  end6end
  3. formatter ← #<⟨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!
  1. suffix ← ?

    1suffix→ ? = "?"2formatter_class = Class.new do3  define_method(:decorate) do |text|4    "#{text}#{suffix}"5  end6end
  2. formatter_class ← ⟨Class A⟩

    1suffix = "?"2formatter_class→ ⟨Class A⟩ = Class.new do3  define_method(:decorate) do |text|4    "#{text}#{suffix}"5  end6end
  3. formatter ← #<⟨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?
  1. suffix ← .

    1suffix→ . = "."2formatter_class = Class.new do3  define_method(:decorate) do |text|4    "#{text}#{suffix}"5  end6end
  2. formatter_class ← ⟨Class A⟩

    1suffix = "."2formatter_class→ ⟨Class A⟩ = Class.new do3  define_method(:decorate) do |text|4    "#{text}#{suffix}"5  end6end
  3. formatter ← #<⟨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.