Avatar

Hi!
whn i try and run my program that im working on i get an error saying: ruby_test.rb:31: undefined method `[]' for nil:NilClass (NoMethodError). When i try to execute the code through TextMate it says:# !> instance variable @parking_lots not initialized. I try to google this problem but just keep banging my head against the wall. Please someone help!
Thanks!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
require 'guest'
require 'parking_lot'

=begin 
	Klass som representerar en camping. Varje Camping har ett fält bestående av
	32 gäster (typen Guest), varav 5 genereras när Campingen skapas. Här finns
	möjlighet att registrera, ta bort och lista gäster.
=end
class Camping
	
	attr_accessor :current_guests, :parking_lots, :all_guests
	
	# Initiera Campingen genom att skapa fältet och generera 5 gäster på 
	# slumpade platser i den 1-baserade listan
	def initialize
		
		# de nuvarande gästerna
		@current_guests = Array.new(32)
		
		# initiera husvagnsplatserna
		@parking_lots = Array.new(32)
		32.times do |nr|
			@parking_lots[nr] = Parking_Lot.new(nr)
		end 
	 end
		
		# samtliga gäster
		@all_guests = []
		
		# initiera incheckade gäster
		defaultGuests = Array[
			Guest.new("Jake", 	"Halmstad",		"1337", 1, @parking_lots[0]),
			Guest.new("Mark", 	"Amsterdam", 	"1234", 2, @parking_lots[1]),
			Guest.new("Conan", 	"Berlin", 		"2532", 3, @parking_lots[2]),
			Guest.new("Tom", 		"Chicago", 		"9318", 4, @parking_lots[3]),
			Guest.new("David", "Dubai", 		"6546", 5, @parking_lots[4]),
		]
		
		# lägg in de incheckade gästerna i nuvarande gästerna samt historiken
		defaultGuests.each do |guest|
			@current_guests[guest.plot.nr] = guest
			@all_guests.push(guest)
		end
	end
	
	# Returnerar en strängrepresentation av gästlistan, dvs to_s från Guest-klassen.
	# Om en plats är ledig skrivs texten "Ledig" ut.
	def to_s
		# skapa en tom sträng som fylls på vidare
		list = ""
		
		# loopa från 1 till 32
		(1..32).each do |n|
			# översätt positionen till 0-baserad array och kolla om det finns 
			# någon gäst registrerad på positionen, och i så fall lägg till 
			# texten i list
			if (!@current_guests[n-1].nil?)
				list += @current_guests[n-1].to_s
			else
				# annars, lägg till texten "Ledig"
				list += n.to_s + ": Ledig\n"
			end
		end
		return list
	end
	
	# Naiv lösning till att slumpa fram en ledig parkeringsplats. Returnerar en
	# ledig plats (nummer mellan 1-32).
	def generateParkingLot
		# slumpa ett tal mellan 1 och 32
		randomNr = 1+rand(32)
		# finns det en gäst på den (0-baserade) positionen?
  		if (!@current_guests[randomNr-1].nil?)
  			# isåfall, generera en ny siffra
  			generateParkingLot
  		else
  			# returnera den genererade siffran
  			return randomNr
  		end
	end
  


=begin
  Klass för att representera en campinggäst. Varje gäst har förnamn, efternamn,
  adress och telefonnummer, telefonnummer, ankomstdatum, en husvagnsplats och
  en elmätarställning. De tre sistnämnda genereras av programmet.
=end
class Guest
  
  attr_accessor :name, :address, :phone, :departure
  attr_reader :arrival, :plot
  
  # konstruktor för en Guest. Initierar gästen med det valda för- och 
  # efternamnet, adress, telefonnummer samt den genererande ny.
  def initialize (name, address, phone, arrival, plot)
    @name = name
    @address = address
    @phone = phone
    @arrival = arrival  # dagens datum i strängformat
    @plot = plot
  end
 

  
  # skriver ut den aktuella registreringen i ett läsbart format
  def to_s
    "
Registrering för #{@name}:
    #{@address}
    #{@phone}
    
    Ankomst: #{@arrival}
    Utchecking: #{@departure}
    #{@plot}
    
"   
  end  
end



require 'camping'
require 'menu'

=begin 
	Huvudklass för programmet. Ansvarar för att skapa en ny Camping och
	påbörja menyloopen.
	
	Robert Sebescen
	2010-06-16
=end
class Main	
	
	if __FILE__ == $0	
		$camping = Camping.new	# skapa en ny camping
		puts "Välkommen till Ruby Camping!"
		
		# loopa igenom menyn
		while (true)
			Menu.menu
		end
	end

end


require 'camping'

=begin
	Klass som ansvarar för att visa meny, hämta indata och utföra händelser
	beroende på val.
=end
class Menu
	
	# Skriver ut menyn
	def self.menu
		puts "------------------------------"
		puts "--         Meny             --"
		puts "--                          --"
		puts "-- 1. Incheckning           --"
		puts "-- 2. Utcheckning           --"
		puts "-- 3. Lista aktuella gäster --"
		puts "-- 4. Lista samtliga gäster --"
		puts "-- 5. Avsluta               --"
		puts "------------------------------"
		action = get_input
		do_action(action)
	end
	
	# Hämtar indata från användaren tills korrekt val har gjorts
	def self.get_input
		input = gets.chomp.to_i
		# gets.to_i returnerar 0 vid fel så vi kollar efter intervallet 1-5
		while input > 5 || input < 1 do
			puts "Felaktigt alternativ eller ogiltig indata."
			input = gets.chomp.to_i
		end
		return input
	end
	
	# Utför vald händelse baserat på valt alternativ.
	def self.do_action(action)
		case action		# när valet är...
			when 1		# 1, gör då...
				check_in
			when 2
				check_out
			when 3
				puts $camping				# skriv ut aktuella gäster
			when 4
				puts $camping.all_guests
			when 5
				exit
		end
	end
	
	# Ber användaren om data och registrerar en gäst på en slumpmässig 
	# husvagnsplats samt i historiken.
	def self.check_in
		puts "Skriv in ditt namn: "
		name = gets.chomp
		puts "Skriv in din adress: "
		address = gets.chomp
		puts "Skriv in ditt telefonnummer: "
		phone = gets.chomp
		puts "Skriv in ankomstdag (ett tal):"
		arrival = gets.chomp.to_i
		
		# hämta ledig plats och låta gästens plats peka på den
		newPLot = $camping.generateParkingLot
		newGuest = Guest.new(name, address, phone, arrival, $camping.parking_lots[newPLot-1])
		$camping.current_guests[newPLot-1] = newGuest
		$camping.all_guests.push(newGuest)	# lägg till gästen i historiken
		
		puts "Registreringen lyckades. Du har fått husvagnsplats " + newPLot.to_s + "."
	end
	
	# Checkar ut en användare, det vill säga frigör parkeringsplatsen han/hon är
	# registrerad på.
	def self.check_out
		
		puts "Vilken gäst vill du checka ut? (ange husvagnsplatsnr):"
		plot = gets.chomp.to_i
		guest = $camping.current_guests[plot-1]
		
		# Fanns det någon gäst där?
		if (guest.nil? || plot < 1)	# hantera fallet med negativt index
			puts "Det finns ingen gäst på den positionen eller så har du angett en ogiltig position."
		else
			puts "Du vill checka ut " + guest.name + "."
			puts "Ange utcheckningsdatum: "
			departureDate = gets.chomp.to_i
			guest.departure = departureDate
			guestStayedDays = departureDate - guest.arrival		# gästen har stannat så många dygn
			guest.plot.increase(guestStayedDays) 				# öka på elmätaren
			puts guest											# skriv ut gästen
			$camping.current_guests[plot-1] = nil				# töm platsen
		end
	end
 
end


=begin
	Representerar en husvagnsplats. Varje husvagnsplats har ett nummer och en
	elmätare.
=end
class Parking_Lot
	
	attr_accessor :nr, :gauge;
	
	# Initierar en ny husvagnsplats med numret nr och en elmätare mellan
	# 2000 och 4000.
	def initialize (nr)
		@nr = nr
		@gauge = 2000+rand(2000)	# slumpa tal mellan 2000 och 4000
	end
	
	# Ökar elmätaren för användning med en slumpmässig mängd mellan 
	# 10-80 kWh per dygn.
	def increase(days)
		generatedUse = (10+rand(70))*days
		puts "Ökar elmätaren med " + generatedUse.to_s + " kWh."
		@gauge += generatedUse
	end
	
	# Returnerar en strängrepresentation av husvagnsplatsen.
	def to_s
		"
	Husvagnsplats #{@nr+1}:
	Elmätare #{@gauge} kWh
		"
	end
	
end 

Refactorings

No refactoring yet !

Avatar

steved

July 19, 2010, July 19, 2010 23:04, permalink

No rating. Login to rate!

You initialize @parking_lots as in instance variable in initialize(). Your error on line 31 is because in the body of the class (outside a method definition), @parking_lots is a class instance variable. See http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/.>

Avatar

tragicdancer

July 20, 2010, July 20, 2010 10:00, permalink

No rating. Login to rate!

Ok thanks. but how should i do it then. I must confess at this point I am a bit confused on the whole matter. Help much appreciated:)
Thanks

B444317a678d3eda425f8b0ac8345383

stevec

July 23, 2010, July 23, 2010 18:38, permalink

No rating. Login to rate!

It looks like you can just move the "end" on line 25 down to line 81.

Your refactoring





Format Copy from initial code

or Cancel