40

I am very curious to know what the difference is between send and public_send. E.g.:

class Klass
  def hello(*args)
    "Hello " + args.join(' ')
  end
end

k = Klass.new
k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
k.public_send :hello, "gentle", "readers" #=> "Hello gentle readers"
Chris
  • 26,361
  • 5
  • 21
  • 42
Amit Suroliya
  • 1,515
  • 1
  • 11
  • 21

1 Answers1

65

Unlike send, public_send calls public methods only.

Source

Example:

class Klass
  private
  def private_method
    puts "Hello"
  end
end

k = Klass.new
k.send(:private_method)
# => "Hello"

k.public_send(:private_method)
# => `public_send': private method `private_method' called for #<Klass:0x007f5fd7159a80> (NoMethodError)

You may want to prefer #public_send over #send so as not to circumvent private/protected visibility.

BinaryButterfly
  • 18,137
  • 13
  • 50
  • 91
Casper
  • 33,403
  • 4
  • 84
  • 79