From: Rein Henrichs Date: 2010-06-08T13:55:06+09:00 Subject: Re: Defining struct in a class On 2010-06-07 16:16:57 -0700, William Song said: > Rein Henrichs wrote: >> On 2010-06-07 15:16:33 -0700, William Song said: >> >>> >>> This will give me an error message saying the push is not defined for >>> NilClass. How should I fix this? >> >> The error you reported has nothing to do with your Card struct. Besides >> which, your code works for me as is. > > Sorry, I meant to put it into a function. I over-simplified it when > posted here. > > class Cards > Card = Struct.new(:suit, :number) > @cardsOnHand=[] > > def a() > @cardsOnHand.push(Card.new("S","5")) > end > end > > cards = Cards.new > cards.a() > > The above code will give an error. You create an instance variable, @cardsOnHand, in the class scope. That means it is an instance variable of the object Cards (the class). You then attempt to access it in the scope of an instance method, i.e. on a Cards instance. They are two different objects, two different scopes and two different variables. I would suggest reading the chapter Classes, Objects and Variables in http://ruby-doc.org/docs/ProgrammingRuby to better understand the concept of scope in Ruby and how it effects variables. Hint: you probably want to set this instance variable when you *initialize* an Cards object. I would also suggest reading http://github.com/chneukirchen/styleguide/blob/master/RUBY-STYLE to get a better grasp of common Ruby style, such as two space indention, adding spacing before and after the = in a variable assignment, using camel_case for variable and method names, and removing empty () on the ends of methods. -- Rein Henrichs http://puppetlabs.com http://reinh.com