oop/send/dispatch.rb

tests/_examples/oop/send/dispatch.rb in the metorex repository.

# `send` and `__send__` name the method with a Symbol or a String, and say so
# when handed anything else.

class Greeter
  def greet
    "hello"
  end

  def self.build
    new
  end

  def collect(first, *rest)
    [first, *rest]
  end
end

puts Greeter.new.send(:greet)
puts Greeter.new.__send__("greet")
puts Greeter.send(:build).greet

puts Greeter.new.send(:collect, :one).inspect
puts Greeter.new.send(:collect, :one, :two).inspect

begin
  Greeter.new.send(42)
rescue TypeError => error
  puts error.message
end

begin
  Greeter.new.send
rescue ArgumentError => error
  puts error.message
end

begin
  Greeter.new.send(:missing)
rescue NoMethodError
  puts "NoMethodError for a name nothing defines"
end

puts BasicObject.instance_methods(false).sort.inspect
puts BasicObject.public_instance_methods(false).include?(:__send__).to_s

first_module = Module.new do
  def steps(taken)
    taken.push :first
  end
end

second_module = Module.new do
  def steps(taken = [])
    super(taken)
    taken.push :second
  end
end

layered = Class.new do
  include first_module
  include second_module
end

puts layered.new.steps.inspect

Output:

hello
hello
hello
[:one]
[:one, :two]
42 is not a symbol nor a string
no method name given
NoMethodError for a name nothing defines
[:!, :!=, :==, :__id__, :__send__, :equal?, :instance_eval, :instance_exec]
true
[:first, :second]