methods/default_that_redefines.rb

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

# A default value is evaluated each time the method is called without the
# argument, and it may define methods, including the one being called.

class Greeter
  def greet(x = (def greet; "hello"; end; 1))
    x
  end
end

greeter = Greeter.new
p(greeter.greet(42))
p(greeter.greet)
p(greeter.greet)

holder = Object.new
holder.instance_eval do
  def prepare(a = (def from_default; end))
    def from_body; end
  end
end
holder.prepare
p([holder.respond_to?(:from_default), holder.respond_to?(:from_body)])
p(Object.new.respond_to?(:from_default))

Output:

42
1
"hello"
[true, true]
false