Ruby can call a method whose name is stored in a variable.

dynamic call `public_send` calls a public method by name while keeping the example bounded and explicit.

Send Basics

method_name
send_basics.rb
Replay: real traced execution (multi-file project)
class Greeter
  def greet
    "hello"
  end

  def shout
    "HELLO"
  end

  def label
    "greeting"
  end
end

method_name = "greet"
greeter = Greeter.new

result = greeter.public_send(method_name)

puts "method=#{method_name}"
puts "result=#{result}"
class Greeter
  def greet
    "hello"
  end

  def shout
    "HELLO"
  end

  def label
    "greeting"
  end
end

method_name = "shout"
greeter = Greeter.new

result = greeter.public_send(method_name)

puts "method=#{method_name}"
puts "result=#{result}"
class Greeter
  def greet
    "hello"
  end

  def shout
    "HELLO"
  end

  def label
    "greeting"
  end
end

method_name = "label"
greeter = Greeter.new

result = greeter.public_send(method_name)

puts "method=#{method_name}"
puts "result=#{result}"
  1. method_name ← greet, greeter ← ⟨Greeter A⟩

    15method_name→ greet = "greet"  #@method_name="shout", "label"16greeter→ ⟨Greeter A⟩ = Greeter.new1718result = greeter.public_send(method_name)hello
  2. result ← hello

    18result→ hello = greeter.public_send(method_name)hello1920puts "method=#{method_namegreet}"21puts "result=#{resulthello}"
    outputmethod=greet
    result=hello
  1. method_name ← shout, greeter ← ⟨Greeter A⟩

    15method_name→ shout = "shout"16greeter→ ⟨Greeter A⟩ = Greeter.new1718result = greeter.public_send(method_name)HELLO
  2. result ← HELLO

    18result→ HELLO = greeter.public_send(method_name)HELLO1920puts "method=#{method_nameshout}"21puts "result=#{resultHELLO}"
    outputmethod=shout
    result=HELLO
  1. method_name ← label, greeter ← ⟨Greeter A⟩

    15method_name→ label = "label"16greeter→ ⟨Greeter A⟩ = Greeter.new1718result = greeter.public_send(method_name)greeting
  2. result ← greeting

    18result→ greeting = greeter.public_send(method_name)greeting1920puts "method=#{method_namelabel}"21puts "result=#{resultgreeting}"
    outputmethod=label
    result=greeting