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