methods/nested_definitions_no_parens.rb
tests/_examples/methods/nested_definitions_no_parens.rb in the metorex repository.
# Where a `def` installs its method and what visibility it gets: a method
# defined at the top level is private on Object, `initialize` is always
# private, and a `def` run from a method body installs where that method was
# defined, publicly.
# Written with as few parentheses as Ruby allows.
def helper_at_top_level
:helper
end
p Object.private_method_defined?(:helper_at_top_level)
class Account
def initialize
@opened = true
end
private
def open_ledger
def ledger_entry
:entry
end
end
end
p Account.private_method_defined?(:initialize)
account = Account.new
account.send(:open_ledger)
p account.ledger_entry
p Account.public_method_defined?(:ledger_entry)
built = Class.new do
def prepare
def prepared
:prepared
end
end
end
built.new.prepare
p built.new.prepared
p Object.new.respond_to?(:prepared)
holder = Object.new
holder.instance_eval do
def configure
def configured
:configured
end
end
end
holder.configure
p holder.configured
p Object.new.respond_to?(:configured)
target = Object.new
def (target).label
:labeled
end
p target.label
frozen = Class.new
frozen.freeze
begin
frozen.class_eval do
def refused; end
end
rescue FrozenError => error
p error.class
end
def needs_two(first, second = 2)
[first, second]
end
begin
needs_two
rescue ArgumentError => error
p error.message
end
def reads_itself(value = value)
value
end
p reads_itself
begin
eval "def two_splats(*first, *second); end"
rescue SyntaxError
p SyntaxError
end
class Runner
def run(&block)
Object.new.instance_exec(&block)
end
end
Runner.new.run do
[1].each do
def defined_in_exec
:ran
end
end
end
p Runner.method_defined?(:defined_in_exec)
Output:
true
true
:entry
true
:prepared
false
:configured
false
:labeled
FrozenError
"wrong number of arguments (given 0, expected 1..2)"
nil
SyntaxError
false