callables/copies_and_visibility_parens.rb
tests/_examples/callables/copies_and_visibility_parens.rb in the metorex repository.
# A copy of a callable is its own object that still compares equal, and
# `public_send` reaches only what a caller outside the object could write.
class Holder
def open_door
:open
end
def shut_door
:shut
end
protected :shut_door
def hidden_door
:hidden
end
private :hidden_door
end
held = Holder.new
taken = held.method(:open_door)
copied = taken.clone
p(copied == taken)
p(copied.equal?(taken))
p(copied.call)
taken.instance_variable_set(:@note, :kept)
p(taken.clone.instance_variables)
step = proc { :stepped }
p(step.dup == step)
p(step.dup.equal?(step))
p(held.public_send(:open_door))
[:shut_door, :hidden_door].each do |named|
begin
held.public_send(named)
rescue NoMethodError => refused
puts(refused.message)
end
end
p(:upcase.to_proc.lambda?)
p(:upcase.to_proc.parameters)
p(:upcase.to_proc.call("shout"))
Output:
true
false
:open
[:@note]
true
false
:open
protected method 'shut_door' called for an instance of Holder
private method 'hidden_door' called for an instance of Holder
true
[[:req], [:rest]]
"SHOUT"