Metaprogramming Basics
Send Basics
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
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}"
method_name ← greet, greeter ← ⟨Greeter A⟩
15method_name→ greet = "greet" #@method_name="shout", "label"16greeter→ ⟨Greeter A⟩ = Greeter.new1718result = greeter.public_send(method_name)helloresult ← hello
18result→ hello = greeter.public_send(method_name)hello1920puts "method=#{method_namegreet}"21puts "result=#{resulthello}"outputmethod=greet result=hello
method_name ← shout, greeter ← ⟨Greeter A⟩
15method_name→ shout = "shout"16greeter→ ⟨Greeter A⟩ = Greeter.new1718result = greeter.public_send(method_name)HELLOresult ← HELLO
18result→ HELLO = greeter.public_send(method_name)HELLO1920puts "method=#{method_nameshout}"21puts "result=#{resultHELLO}"outputmethod=shout result=HELLO
method_name ← label, greeter ← ⟨Greeter A⟩
15method_name→ label = "label"16greeter→ ⟨Greeter A⟩ = Greeter.new1718result = greeter.public_send(method_name)greetingresult ← greeting
18result→ greeting = greeter.public_send(method_name)greeting1920puts "method=#{method_namelabel}"21puts "result=#{resultgreeting}"outputmethod=label result=greeting