[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Class variable as parameter

Filipe

11/23/2007 9:17:00 PM

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?

Thanks in advance :)
8 Answers

Morton Goldberg

11/23/2007 10:01:00 PM

0

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

Filipe

11/23/2007 11:23:00 PM

0

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. 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...

7stud --

11/23/2007 11:27:00 PM

0

Morton Goldberg wrote:
>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
>

Here it is explicitly:

class MyClass

def num=(val)
@num = val
end

def num
@num
end

def initialize(val)
@num = val
end

end

t = MyClass.new(1)
puts t.num


which is equivalent to:

class MyClass
attr_accessor :num

def initialize(val)
@num = val
end

end

t = MyClass.new(1)
puts t.num
--
Posted via http://www.ruby-....

7stud --

11/23/2007 11:38:00 PM

0

Filipe wrote:
> I have the following situation:
> def initialize
> @myVar=0
> setVar(@myVar,1)>
>
> Unfortunately, this piece of code is returning 0 instead of the 1 I
> would expect. Is there anything I could do?
>

Yes:

def initialize
@myVar = 0
@myVar = 1
...


--
Posted via http://www.ruby-....

Morton Goldberg

11/24/2007 1:12:00 AM

0

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



Matt Todd

11/25/2007 1:50:00 PM

0

> >> 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?

The most stylish, Ruby way to do what you are trying to do is as follows:

class MyClass

def initialize
@myVar1 = 0 # direct value manipulation
self.myVar1 = 1 # sent through your wrapper
puts @myVar1
end

def myVar1=(value)
@myVar1 = value
# process extra steps here
end

end

(Ehm, I should admit, there may be a better way to actually get the
accessor method to fire inside of initialize than self.myVar1, but
that's what I found to work.)

Filipe

11/25/2007 10:37:00 PM

0

On Nov 25, 11:50 am, Matt Todd <chiol...@gmail.com> wrote:
> > >> On Nov 23, 2007, at 4:20 PM,Filipewrote:
> > >>> 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?
>
> The most stylish, Ruby way to do what you are trying to do is as follows:
>
> class MyClass
>
> def initialize
> @myVar1 = 0 # direct value manipulation
> self.myVar1 = 1 # sent through your wrapper
> puts @myVar1
> end
>
> def myVar1=(value)
> @myVar1 = value
> # process extra steps here
> end
>
> end
>
> (Ehm, I should admit, there may be a better way to actually get the
> accessor method to fire inside of initialize than self.myVar1, but
> that's what I found to work.)

I would still have to writer a myVar=(value) method for every single
variable. That's what I'm trying to get rid of.

bermonruf

11/26/2007 1:51:00 AM

0

Note: parts of this message were removed by the gateway to make it a legal Usenet post.

You can do something like

--
class Foo

alias_method :method_missing2, :method_missing;

def method_missing(method, *args, &block)
if method.to_s =~ /=$/
set_var($`, args.first);
else
method_missing2(method, *args, &block);
end
end

private
def set_var(name, value)
instance_variable_set("@#{name}", value);
#do stuff here...
end

end

foo = Foo.new;
foo.car = "test";
p foo #=> #<Foo:0x2fb77e4 @car="test">
--


--
Bernardo Rufino