methods/default_that_redefines_no_parens.rb

tests/_examples/methods/default_that_redefines_no_parens.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.
# Written with as few parentheses as Ruby allows.

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