The reason I disagree with becomes mutating the object in place is because it's inconsistent with *almost* all of Ruby and Rails' APIs. Methods that mutate an object (or raise an exception) end with !. Whether it's a string, hash, or array, methods that mutate these objects have two versions. There are exceptions such as String#clear, but compared to PHP, consistency is something Ruby and Rails have going for them.
Ruby: - Array#map / map! - Array#reverse / reverse! - Array#reject / reject! - Array#sort / sort! - String#gsub / gsub - String#strip / strip! - ...and the list goes on Rails: - Hash#symbolize_keys / symbolize_keys! - Hash#slice / slice! Why diverge from this pattern for a single case? If becomes is not the method for this, them maybe there should be an alternative like object.behave_like(Class) On Saturday, July 21, 2012 3:48:08 PM UTC-4, Nicolás Sanguinetti wrote: > > -1 for the merge. > +1 for a doc fix where this is more explicit. > > I've always used x.becomes(Foo) for the side effect (mutating x) > instead of for the return value. > > As I see it, the name _becomes_ clearly states that the receiver is > affected. If it was #convert or #cast or something that would > reasonably return a new object while not mutating the receiver I could > see how this could be thought of as a bug. > > But it just makes sense that #becomes alters the original object. > > Cheers, > -foca > > > On Fri, Jul 20, 2012 at 11:22 PM, Dheeraj Kumar wrote: > > Got bit by this a couple of weeks ago. +1 for the merge. > > > > > > Dheeraj Kumar > > > > On Saturday 21 July 2012 at 6:14 AM, Peter Brown wrote: > > > > Just stumbled upon a pull request from last year with some discussion > and it > > seemed like people were generally in favor of changing the behavior. I'd > be > > willing to bring it back to life if people are still interested in it. > > > > On Friday, July 20, 2012 6:45:31 PM UTC-4, Matt jones wrote: > > > > > > On Jul 20, 2012, at 5:48 PM, Peter Brown wrote: > > > >> I ran into an interesting issue today with ActiveRecord's becomes > method > >> and discovered that it is mutating the receiver without me knowing it. > >> > >> The API docs say > >> > >> "The new instance will share a link to the same attributes as the > original > >> class. So any change to the attributes in either instance will affect > the > >> other." > >> > >> However, it doesn't say that the type attribute is changed on the > receiver > >> just by the method call. > > > > 'type' is an attribute; it gets changed - and the docs say the changes > will > > happen to both. A bit unclear, but not a bug. > > > > Definitely worth an update to the documentation, though. > > > > --Matt Jones > > > > -- > > You received this message because you are subscribed to the Google > Groups > > "Ruby on Rails: Core" group. > > To view this discussion on the web visit > > https://groups.google.com/d/msg/rubyonrails-core/-/22M16_XMSnYJ. > > To post to this group, send email to > > To unsubscribe from this group, send email to > > For more options, visit this group at > > http://groups.google.com/group/rubyonrails-core?hl=en. > > > > > > -- > > You received this message because you are subscribed to the Google > Groups > > "Ruby on Rails: Core" group. > > To post to this group, send email to > > To unsubscribe from this group, send email to > > For more options, visit this group at > > http://groups.google.com/group/rubyonrails-core?hl=en. > -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-core/-/ThN68pR9-9UJ. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
