Class setter

V

Ves Pasian

For the life of me I can figure out why the setter below returns "v" and
not nil

class A
def initialize(id)
@id = id
end

def id
@id
end

def id=(v)
nil
end
end

a = A.new(1)
a.id = 2
=> 2

Any idea?
TIA,
ves
 
Y

Yossef Mendelssohn

For the life of me I can figure out why the setter below returns "v" and
not nil

class A
=A0 def initialize(id)
=A0 =A0 @id =3D id
=A0 end

=A0 def id
=A0 =A0 @id
=A0 end

=A0 =A0def id=3D(v)
=A0 =A0 =A0nil
=A0 =A0end
end

a =3D A.new(1)
a.id =3D 2
=3D> 2

That's just the way setters work in Ruby. Any method ending in =3D will
return what you pass to it.
That way, it's analogous to setting regular variables, like x =3D y =3D z.

On a similar note, though you "configure" the class method .new with
the instance method #initialize, you can't make .new return something
other than an instance of the class just by the return value of
#initialize.
 
S

Sebastian Hungerecker

Yossef said:
On a similar note, though you "configure" the class method .new with
the instance method #initialize, you can't make .new return something
other than an instance of the class just by the return value of
#initialize.

That's not really similar. The only connection between new and initialize is
that new calls initialize. There is no rule that a method that calls another
method should return the return value of that method (given that new calls
two methods, that'd be impossible anyway). So new returning the newly created
object even though it calls initialize is perfectly ordinary. The behaviour
of setters, however, is a special case.
 
Y

Yossef Mendelssohn

That's not really similar. The only connection between new and initialize= is
that new calls initialize. There is no rule that a method that calls anot= her
method should return the return value of that method (given that new call= s
two methods, that'd be impossible anyway). So new returning the newly cre= ated
object even though it calls initialize is perfectly ordinary. The behavio= ur
of setters, however, is a special case.

Good point and clarification. It just seems similar to me because
normal usage involves defining #initialize and calling .new, but it's
as you say -- one method calls the other and doesn't use that return
value.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top