From: "Jesús Gabriel y Galán" Date: 2009-10-24T16:06:30+09:00 Subject: Re: Setting attribute via send in Ruby 1.8.6 On Fri, Oct 23, 2009 at 6:40 PM, Charles Calvert wrote: > On Fri, 23 Oct 2009 17:18:22 +0200, Robert Klemme > wrote in > <7kdvpuF37n3jvU1@mid.individual.net>: > >>On 10/23/2009 05:10 PM, Charles Calvert wrote: >>> Using Ruby 1.8.6. >>> >>> I've run into an instance in which I'd like to set attributes of an >>> instance using the send method.  I've looked around, but found >>> nothing, most likely because I'm using the wrong search terms. > > [snip example] > >>> I get the following error: "wrong number of arguments (1 for 0) >>> (ArgumentError)" >>> >>> Am I correct in thinking that this is possible, and that I'm just >>> going about it the wrong way? >> >>Yes. >> >>... > > The suspense almost killed me! > >>:-) >> >>You need to use the _setter_ method with #send - which happens to be >>called "foo=" in your case. > > Ah, now the lightbulb goes off.  I should have remembered the > convention of having the setter have an equals sign as part of the > name.  I'm too used to languages that determine which accessor is used > based on which side of the assignment it appears rather than actually > using a method name to syntactically simulate assignment. You can achieve what you want if instead of using attr_writer you roll your own. I remember a discussion in this list regarding something like: class A def a *args return @a if args.empty? @a = args[0] end end a = A.new a.a #=> nil a.a 4 #=> 4 a.a #=> 4 With this you can do a.send(:a, 4) Jesus.