introspection/method_shapes.rb
tests/_examples/introspection/method_shapes.rb in the metorex repository.
# What a Method object reports about the method it stands for.
module Greetings
def hello(name)
"hello #{name}"
end
end
class Greeter
include Greetings
def greet(name, greeting = "Hi", *rest, punctuation:, times: 1, **options, &block)
greeting
end
end
p Greeter.new.method(:greet).parameters
p Greeter.new.method(:greet).arity
p Greeter.instance_method(:greet).arity
p Greeter.new.method(:hello).owner
p Greeter.new.method(:hello).super_method
class Loud < Greeter
def greet(name)
super
end
end
p Loud.new.method(:greet).super_method.owner
p Loud.instance_method(:greet).super_method.owner
p Object.new.method(:frozen?).super_method
loose = proc { |a, b = 1| }
strict = lambda { |a, b = 1| }
keyworded = proc { |a, k:, **rest| }
shaped = lambda { |a, k:, **rest| }
p loose.arity
p strict.arity
p keyworded.arity
p shaped.parameters
Output:
[[:req, :name], [:opt, :greeting], [:rest, :rest], [:keyreq, :punctuation], [:key, :times], [:keyrest, :options], [:block, :block]]
-3
-3
Greetings
nil
Greeter
Greeter
nil
1
-2
2
[[:req, :a], [:keyreq, :k], [:keyrest, :rest]]