Rails adds send! method to Object?

All,

It appears that Rails adds the send! method to Object, via the output
below.

gandalf-2:royaltyzone weyus$ irb

Object.methods.include?(“send!”)
=> false

exit
gandalf-2:royaltyzone weyus$ script/console
Loading development environment (Rails 2.1.2)

Object.methods.include?(“send!”)
=> true

exit

I assume this is to provide backward compatibility with the new send!
method in Ruby 1.9 that allows you to still dynamically call private
methods? Is this correct?

Thanks,
Wes

Hi –

On Fri, 17 Jul 2009, Wes G. wrote:

gandalf-2:royaltyzone weyus$ script/console
Loading development environment (Rails 2.1.2)

Object.methods.include?(“send!”)
=> true
exit

I assume this is to provide backward compatibility with the new send!
method in Ruby 1.9 that allows you to still dynamically call private
methods? Is this correct?

There’s no send! in 1.9. I wish there were; I like send/send! more
than public_send/send, and I think Matz put it in there briefly but
then decided that switching the sense of send was too
backwards-incompatible. Also there was some question which was the
“dangerous” one: the one that included private methods, or the one
that didn’t.

It appears to be gone from Rails, so maybe it was only there during
the brief period that it was in 1.9.

$ ./script/console
Loading development environment (Rails 2.3.2)

Object.new.send!
NoMethodError: undefined method `send!’ for #Object:0x2378780
from (irb):6

David


David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Now available: The Well-Grounded Rubyist (The Well-Grounded Rubyist)
Training! Intro to Ruby, with Black & Kastner, September 14-17
(More info: http://rubyurl.com/vmzN)

I’m using Rails 2.1.2 at the moment.

So I need to reliably call a private method dynamically, and I don’t
want to have to change how I do it when I move to Rails 2.3.2 nor Ruby
1.9.

Should I use Object#send or something else?

Thanks,
Wes

Hi –

On Fri, 17 Jul 2009, Wes G. wrote:

I’m using Rails 2.1.2 at the moment.

So I need to reliably call a private method dynamically, and I don’t
want to have to change how I do it when I move to Rails 2.3.2 nor Ruby
1.9.

Should I use Object#send or something else?

Object#send (or send, if you like that one) should be fine. It
looks like Rails’s send! is just an alias. From ActiveSupport:

class Object
unless respond_to?(:send!)
# Anticipating Ruby 1.9 neutering send
alias send! send
end

“Neutered” meaning that it won’t call private methods, I assume – but
that decision was rescinded.

David


David A. Black / Ruby Power and Light, LLC
Ruby/Rails consulting & training: http://www.rubypal.com
Now available: The Well-Grounded Rubyist (The Well-Grounded Rubyist)
Training! Intro to Ruby, with Black & Kastner, September 14-17
(More info: http://rubyurl.com/vmzN)