On 10/24/2009 09:06 AM, Jesù¸ Gabriel y GaláÏ wrote: > On Fri, Oct 23, 2009 at 6:40 PM, Charles Calvert <cbciv / yahoo.com> wrote: >> On Fri, 23 Oct 2009 17:18:22 +0200, Robert Klemme >> <shortcutter / googlemail.com> 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! I'm glad I did not extend the pause even more. :-) >>> :-) >>> >>> 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) This also has the added advantage to be easier with #instance_eval, i.e. ou can then do obj = A.new obj.instance_eval do a 10 end If you had to use a= in the block you would have to write "self.a = 10" in order to prevent recognition of "a" as a local variable. Nevertheless, the general convention is to use a=. Btw, you could even create a custom attr_accessor method that will create both variants so you can do obj.a # getter obj.a = 10 # setter obj.a(10) # setter Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/