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>> exitgandalf-2:royaltyzone weyus$ script/console Loading development environment (Rails 2.1.2)>> Object.methods.include?("send!")=> true>> exitI 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 -- Posted via http://www.ruby-forum.com/.
Hi -- On Fri, 17 Jul 2009, Wes Gamble wrote:> > 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 -- David A. Black / Ruby Power and Light, LLC Ruby/Rails consulting & training: http://www.rubypal.com Now available: The Well-Grounded Rubyist (http://manning.com/black2) 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 -- Posted via http://www.ruby-forum.com/.
Hi -- On Fri, 17 Jul 2009, Wes Gamble 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 (http://manning.com/black2) Training! Intro to Ruby, with Black & Kastner, September 14-17 (More info: http://rubyurl.com/vmzN)