methods/super_forms_no_parens.rb

tests/_examples/methods/super_forms_no_parens.rb in the metorex repository.

# What `super` reaches and what it hands on: a bare `super` passes the
# parameters as they stand, a block reaches the method it was written in, an
# alias starts past the class that wrote the body, and a method nothing above
# defines goes to method_missing.

class Recorder
  def record *values, **options
    [values, options]
  end

  def pair first, second
    [first, second]
  end
end

class Adjusted < Recorder
  def record first, second = 2, *rest, last, flag: :off
    first = 10
    rest << :added
    super
  end

  def pair _, _
    _ = :changed
    super
  end
end
p Adjusted.new.record 1, 5
p Adjusted.new.record 1, 3, 4, 5, flag: :on
p Adjusted.new.pair :a, :b

class InBlock < Recorder
  def record value
    [1].map { super() }.first
  end

  def pair first, second
    -> { super }.call
  end
end
p InBlock.new.record 7
p InBlock.new.pair 3, 4

built = Class.new Recorder do
  define_method :pair do |first, second|
    super
  end
end
begin
  built.new.pair 1, 2
rescue RuntimeError => error
  p error.message
end

class Hidden
  undef_method :frozen?
end

class Asks < Hidden
  def frozen?
    super
  end

  def method_missing name, *arguments
    [:missing, name]
  end
end
p Asks.new.frozen?

class Named
  def label
    [:named]
  end
end

class Relabeled < Named
  def label
    [:relabeled] + super
  end
end

class Copied < Relabeled
  alias_method :tag, :label
end
p Copied.new.tag

module Plain
  def build
    :plain
  end
end

module Wrapped
  def build
    [:wrapped, super]
  end
end

class Factory
  extend Plain
  extend Wrapped
end
p Factory.build

module Sends
  def __send__ name, *arguments
    super
  end
end

class Sender
  include Sends

  def answer
    42
  end
end
p Sender.new.__send__ :answer

Output:

[[10, 2, :added, 5], {flag: :off}]
[[10, 3, 4, :added, 5], {flag: :on}]
[:changed, :b]
[[], {}]
[3, 4]
"implicit argument passing of super from method defined by define_method() is not supported. Specify all arguments explicitly."
[:missing, :frozen?]
[:relabeled, :named]
[:wrapped, :plain]
42