2010-08-02 2 views
2

Привет, я получаю основную ошибку, которая действительно стандартная, я полагаю, в Ruby, но не знаю, что с ней делать. У меня есть программа, которую я написал. Его цель - зарегистрировать гостей в кемпинге. У вас есть меню с 5 различными вариантами. 1. Проверка. Когда я делаю это, я получаю неопределенный метод generateParkingLot' for #<Camping:0x10030a768> (NoMethodError) When I choose Checkout I get a undefined local variable or method departure 'для Menu: Class (NameError). Так что, пожалуйста, у кого-то есть ключ к моей проблеме, было бы здорово. Я здесь вставлю весь мой код. Код разделяется в разных файлах, и я использовал require для разных файлов. Здесь, хотя я вставлю весь код в один след. Благодарен за помощь.Помощь! check_in ': undefined method `push' for nil: NilClass (NoMethodError)

-Sebastien

require 'guest' 

require 'parking_lot' 

class Camping 

attr_accessor :current_guests, :parking_lots, :all_guests, :staticGuests 

def initialize(current_guests, parking_lots, all_guests, staticGuests) 

    @current_guests = Array.new() 

# initiera husvagnsplatserna 
@parking_lots = Array.new(32) 
32.times do |nr| 
    @parking_lots[nr] = Parking_Lot.new(nr) 

    @staticGuests = Array[ 
    Guest.new("Logan Howlett", "Tokyo", "07484822",1, @parking_lots[0]), 
    Guest.new("Scott Summers", "Chicago", "8908332", 2, @parking_lots[1]), 
     Guest.new("Hank Moody", "Boston", "908490590", 3, @parking_lots[2]), 
     Guest.new("Jean Grey", "Detroit", "48058221", 4, @parking_lots[3]), 
     Guest.new("Charles Xavier","Washington DC", "019204822",5, @parking_lots[4]) 
      ] 

    end 

@all_guests = []  

    @staticGuests.each do |guest| 
    @current_guests[guest.plot.nr] = guest 
    @all_guests.push(guest) 
end        
end 


def to_s 
    # creates an empty string 
    list = " " 

    # loop from 1 to 32 
    (1..32).each do |n| 
     if ([email protected]_guests[n-1].nil?) 
      list += @current_guests[n-1].to_s 
     else 
      # else adds the text "Vacant" 
      list += n.to_s + ": Vacant!\n" 
     end 
    return list 
end 

def generateParkingLot 

    randomNr = 1+rand(32) 
    # exists a guest at the (0-based) position? 
    if ([email protected]_guests[randomNr-1].nil?) 
     # if so generate a new figure 
     generateEmpty(array) 
    else 
     # returns the generated number 
     return randomNr 
    end 
    end 
    end 
    end 

class Guest 

attr_accessor :firstname, :lastname, :address, :phone, :departure 
attr_reader :arrived, :plot 


def initialize (firstName, lastName, address, phone, plot) 
@firstName = firstName 
@lastName = lastName 
@address = address 
@phone = phone 
@arrived = arrived 
@plot = plot   

конец

def to_s 
    "Personal information: 
    (#{@firstName}, #{@lastName}, #{@address}, #{@phone}, #{@arrived}, #{@departure},  #{@plot})" 
    end 
end      


require 'ruby_camping' 
require 'camping_guests' 

class Main 

if __FILE__ == $0 
    $camping = Camping.new(@current_guests, @all_guests, @parking_lots,@staticGuests) 
    puts "\n" 
    puts "Welcome to Ruby Camping!" 

while (true) 
    Menu.menu 
    end 
end 
end 


require 'date'      
require 'camping_guests' 
require 'guest' 

class Menu 

def initialize(guests = []) 
    @camping = Camping.new(guests) 
end 



def self.menu 
    puts "---------------------------" 
    puts "  Menu"       
    puts " 1. Checkin" 
    puts " 2. Checkout" 
    puts " 3. List current guests" 
    puts " 4. List all guests" 
    puts " 5. Exit\n" 
    puts "" 
    puts " What do you want to do?" 
    puts "---------------------------" 
    print ": " 
    action = get_input 
    do_action(action) 
end 

# fetches menu choice and returns chosen alternativ 
def self.get_input 
    input = gets.chomp.to_i 

while (input > 5 || input < 1) do 
    puts "Ooups, please try again." 
    input = gets.chomp.to_i 
end 
    return input 
end 

def self.do_action(action) 
    case action 
    when 1: 
     check_in 
    when 2: 
     check_out 
    when 3: 
     puts $camping.current_guests 
     when 4: 
     puts $camping.all_guests 
     when 5: 
     puts "You are now leaving the camping, welcome back!" 
     exit  
    end 
    end 


def self.check_in 
    puts "Welcome to the checkin" 
    puts "Please state your first name: " 
    firstName = gets.chomp 
    puts "Please state your last name:" 
    lastName = gets.chomp 
    puts "Write your address: " 
    address = gets.chomp 
    puts "and your phone number: " 
    phone = gets.chomp 
    puts "finally, your arrival date!" 
    arrived = gets.chomp 
    newPLot = $camping.generateParkingLot 
    newGuest = Guest.new(firstName, lastName, address, phone,arrived,$camping.parking_lots[newPLot-1]) 
    $camping.current_guests[newPLot-1] = newGuest 
    @all_guests.push(newGuest) 
    puts "The registration was a success!! You have received the " + newPLot.to_s + "." 
    end       

    def self.check_out 
    puts "Welcome to checkout!" 
    puts $camping.all_guests 
    puts "State plot of the person to checkout!" 
    plot = gets.chomp.to_i 
    puts "Ange utcheckningsdatum: " 
    departureDate = gets.chomp.to_i 
    guest = $camping.current_guests[plot-1]  
    @departure = departure 
    guest.departure = departureDate 
    guestStayedDays = departureDate - guest.arrived  
    guest.plot.increase(guestStayedDays)     
    puts guest          
    $camping.current_guests[plot-1] = nil    
    end 
end 


class Parking_Lot 

attr_accessor :nr 
attr_reader :electricity_meter 

def initialize (nr) 
    @nr = nr 
    @electricity_meter = 4000-rand(2000)  
    end 

def increase_meter(days) 
    generatedUse = (10+rand(70))*days 
    puts "Increases the meter with " + generatedUse.to_s + " kWh." 
    @electricity_meter += generatedUse 
end 

def to_s 

    "Plot #{@nr+1} Electricity meter: #{@electricity_meter} kWh" 

end 
end 
+1

У вашего сообщения есть серьезные проблемы с форматированием. Пожалуйста, измените. –

+0

Да, вам нужно поставить четыре пробела в начале каждой строки кода, чтобы он форматировался как код –

+0

Спасибо за помощь ребятам с форматированием кода. – Sebastien

ответ

1

Это выглядит (хотя я не пробовал это), как некоторые из ваших ваших «конца неверен.

Тот, который вызывает вашу первую ошибку (generateParkingLot не определено), что generateParkingLot фактически определяется внутри to_s, так что вам нужен дополнительный «конец» в конце вашего метода to_s.

Что касается второй ошибки (вылета не распознан), на следующие строки в self.check_out виноват:

@departure = departure 

, потому что нет никакого «вылета» переменной. (Возможно, вы имели в виду DepartureDate?). Я подозреваю, что может быть несколько других проблем с этим кодом, но я боюсь, что у меня сейчас нет времени проверять.

Один я заметил, что когда у вас есть

32.times do |nr| 
    @parking_lots[nr] = Parking_Lot.new(nr) 

Я думаю, вы могли бы хотеть, чтобы закончить это, либо с «конца» или фигурные скобки, например

32.times do |nr| 
    @parking_lots[nr] = Parking_Lot.new(nr) 
end 

Хотя что бы ваши другие блоки не совпадают .. В общем, просто попробуйте и убедитесь, что ваши блоки все определены правильно (например, все имеет конец соответствия).

+0

Спасибо за помощь Грант. Я сделал так, как сказал ты, и начал проверять, блокирует ли он, чтобы убедиться, что все они имеют соответствующие концы. Однако не нашли недостатков. У вас есть какие-то подсказки ?! – Sebastien

+0

Знаете ли вы, что вам нужен конец для этих «do» петель, например, ** 32.times do | nr | ** из моей реакции? Это не похоже на C# и т. Д., Где вы можете иметь одну строку без завершения блока, и это не заканчивается, когда вы выполняете оператор return. Вот почему ваш метод generateParkingLot не работает, потому что ваш ** (1..32).каждый метод do | n | ** внутри to_s не закрыт, поэтому метод to_s не закрыт. Поместите другой конец в конец вашего метода to_s, и вы должны хотя бы получить метод generateParkingLot. –

+0

Трудно найти достойный учебник только на блоках «делать», но это может помочь: http://ruby.about.com/od/rubyfeatures/a/loops_2.htm –