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 --

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?

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

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 --

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