Morton Goldberg
11/24/2007 1:12:00 AM
On Nov 23, 2007, at 6:24 PM, Filipe wrote:
> On 23 nov, 20:00, Morton Goldberg <m_goldb...@ameritech.net> wrote:
>> On Nov 23, 2007, at 4:20 PM, Filipe wrote:
>>
>>
>>
>>> I have the following situation:
>>
>>> class MyClass
>>> def setVar(var,varValue)
>>> var=varValue
>>> end
>>
>>> def initialize
>>> @myVar=0
>>> setVar(@myVar,1)
>>> puts(@myVar.to_s)
>>> end
>>> end
>>
>>> test = MyClass.new
>>
>>> Unfortunately, this piece of code is returning 0 instead of the 1 I
>>> would expect. Is there anything I could do?
>>
>> Your call to setVar can not change the value of an variable. Only
>> values of variables are passed in Ruby, not the variables themselves.
>>
>> def setVar(var,varValue)
>> var=varValue # <-- this is the same as: return varValue
>> end
>>
>> def initialize
>> @myVar=0
>> setVar(@myVar,1) # <-- at this point this is the same as:
>> setVar(0,1)
>> puts(@myVar.to_s)
>> end
>>
>> Ruby has a built-in method, Object#instance_variable_set that you can
>> use for situations where you need to assign by name, so you don't
>> need to define it for any derived class. Also, Ruby can define
>> accessor methods for you:
>>
>> class MyClass
>> attr_accessor :myVar
>> def initialize
>> @myVar=0
>> self.myVar = 1
>> puts myVar # <-- to_s not needed; puts applies to_s to
>> objects
>> end
>> end
>> test = MyClass.new
>>
>> This will output 1 and may be what you are looking for.
>>
>> Regards, Morton
>
> The key point is that the setVar method is supposed to do a couple
> more things than just set the value of the variable. I removed them
> from the example just for the sake of simplicity.
That was a bad idea, since it made it impossible for anyone to
understand your real problem and give you the help you were looking for.
> Something like:
>
> class MyClass
> def setVar(var,varValue)
> var=varValue
> #do something else...
> end
>
> def initialize
> @myVar1=0
> @myVar2=0
> @myVar3=0
>
> setVar(@myVar,1)
> setVar(@myVar,2)
> setVar(@myVar,3)
>
> end
> end
>
> test = MyClass.new
>
> Beeing able to "send" the variable to setVar and have its value
> changed would save me many lines of code...
You can use Object#instance_variable_set to solve your problem by
sending the variable's name to setVar.
<code>
class MyClass
def setVar(name, val)
instance_variable_set(name, val)
#do something else...
end
def initialize
@myVar1=0
@myVar2=0
@myVar3=0
setVar(:@myVar1, 1)
setVar(:@myVar2, 2)
setVar(:@myVar3, 3)
end
end
MyClass.new.inspect # => "#<MyClass:0x24b58 @myVar3=3, @myVar2=2,
@myVar1=1>"
</code>
Regards, Morton