I’ve seen two different ways of setting up instance variables in the initialize method:
def initialize(names)
self.games = games
end
and
def initialize(games)
@games = games
end
Both could be accompanied by a
attr_accessor :games
With the both definitions, I could do:
results = Game.new( %w{game1 game2 game3}).games
and resutls would equal the list of three games. Inside the first Game class I can then reference that as ‘games’. while with the second Game class, I would use @games inside the class.
Is the name the only difference or is there something else going on that I can’t see?
That method is calling the games= method. It’s not even necessarily setting an attribute. It may be doing so inside the method, or it may not. You may use the setter if you need to do some massaging of the data before the instance variable is set, for instance. Prefixing the setter with self. is required here because without it ruby has no way to know if you’re trying to call a games= or if you are trying to set a local variable named games.
This is directly setting an instance variable rather than calling a method.
This sets up both a getter (self.games) and a setter (self.games=) for the named attribute. If you end up defining either of those in the class you will be overriding the one set by this attr_accessor call. attr_accessor :games ends up defining:
def games
@games
end
def games=(value)
@games = value
end
Thanks @derekprior; helped clarify things for me.; self.games [the method] works because there was a previous attr_accessor call and, under the covers, it sets @games.
Also, I can see how the different approaches can be used, as in:
attr_accessor : games
attr_reader :user
def initialize :games, :user)
self.games = games
@user = user
end