oop/send/dispatch_parens.rb

tests/_examples/oop/send/dispatch_parens.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]