Skip to main content

public_send_vs_send

🔒 Choosing public_send over send for Safer Metaprogramming​

While send lets you call any method (public, protected, or private), public_send restricts calls to public methods, reducing the risk of unintentionally bypassing encapsulation. Prefer public_send when you don't need to access private methods.

class Secret
def public_method
'public'
end
private
def private_method
'secret'
end
end

obj = Secret.new
obj.public_send(:public_method) #=> "public"
obj.public_send(:private_method) #=> NoMethodError
obj.send(:private_method) #=> "secret" # Avoid unless necessary