Forum: Ruby Class setter

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ves P. (Guest)
on 2008-11-26 18:47
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
Yossef M. (Guest)
on 2008-11-26 18:53
(Received via mailing list)
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.
Sebastian H. (Guest)
on 2008-11-26 19:04
(Received via mailing list)
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.
Yossef M. (Guest)
on 2008-11-26 19:09
(Received via mailing list)
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.
This topic is locked and can not be replied to.