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/