Class setter


#1

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


#2

On Nov 26, 10:43 am, Ves P. removed_email_address@domain.invalid wrote:

end

def id=(v)
nil
end
end

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

That’s just the way setters work in Ruby. Any method ending in = will
return what you pass to it.
That way, it’s analogous to setting regular variables, like x = y = 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.


#3

Yossef M. wrote:

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.


#4

On Nov 26, 10:59 am, Sebastian H. removed_email_address@domain.invalid
wrote:

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.

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.