Более идиоматический способ сделать это? - PullRequest
1 голос
/ 01 сентября 2010

Я делаю программу, и я хотел бы вывести меню с двумя подменю в модуле. Я хочу, чтобы главное меню отображалось только при запуске программы. Затем из главного меню сможете перейти в подменю и обратно. Если кто-то может найти лучший способ сделать это (что я уверен, что есть), пожалуйста, так и скажите. Я даже не уверен, что это сработает. Спасибо!

module Menus

def self.getValidPositiveNumber
    input = gets.chomp

    while (input.to_i.to_s != input && input.to_f.to_s != input) do 
        puts "Ogiltig data. Försök igen."
        input = gets.chomp
    end

    # Är talet större än 0?
    number = input.to_f
    if (number <= 0)
        puts "you cant put that."
        getValidPositiveNumber
    end
    return number
end

def self.get_valid_input(valid_options)

    input = gets.chomp
    while (!valid_options.include?(input) && !valid_options.include?(input.to_i))   
        # både Range och Array har include?
        puts "no good, please choose something inbetween " + valid_options.inspect
        input = gets.chomp
    end
    return input

end


class Menu

    attr_reader  :valid_options_range, :menu_string

    def initialize(valid_options_range, menu_string)
        @valid_options_range = valid_options_range
        @menu_string = menu_string
    end



    def do_menu_action(action)
        raise "Has to be called to in any subclass!"
    end


    def to_s
        return @menu_string
    end
end

   MAIN_MENU = <<END 
 "---------------------------" 
   Welcome to Ruby Camping!
     Menu
  1. Checkin
  2. Checkout
  3. Lists
  4. Economy
  5. Exit

  What do you want to do?
 "---------------------------"
 END

 def make_menu_choice(choice)

 case choice
    when 1:
      $camping.check_in
    when 2:
       $camping.check_out
    when 3:
      $current_menu = LISTS_MENU
    when 4:
      $current_menu = ECONOMY_MENU
    when 5:
      exit
   end
 end


  LISTS_MENU = <<END
"---------------------------"   
 -- 1. List current guests --
 -- 2. List all guests --
 --                          --
 -- 0. Back to Main menu      --
 ------------------------------"
 END


 def make_menu_choice(choice) 
   case choice
    when 1:
      $camping
    when 2:
      $camping.all_guests
    when 0:
      $current_menu = MAIN_MENU
   end
  end

  ECONOMY_MENU = <<END
 "---------------------------"   
 -- 1. List current guests --
 -- 2. List all guests --
 --                          --
 -- 0. Back to Main menu      --
 ------------------------------"
 END

end    

puts Menus::MAIN_MENU 
if Menus == 3 then LISTS_MENU = Lists_Menu.new 
elsif Menus == 4 then ECONOMY_MENU = Economy_Menu.new
end
__END__

Ответы [ 2 ]

0 голосов
/ 01 сентября 2010

Вам следует рассмотреть возможность использования commander gem , который включает highline gem , оба из которых были разработаны для облегчения ввода и проверки пользователем.

0 голосов
/ 01 сентября 2010

Я не буду писать код для вас (извините), но я бы сделал это так:

Общий класс меню, который может быть снабжен пунктами меню, сопоставленными с числами и символами имени метода ...

Тогда я бы создал класс, который имеет методы для всех пунктов меню и будет динамически создавать класс меню, как мне нужно, и снабжать его необходимой информацией ...

Из меню методы будут вызываться так, как

ClassHoldingMethods.method( methodname[entered_number] ).call

(в этом случае methodname - это индексы отображения массива на методы, которые будут вызываться при выборе, и введенный номер проверенного пользователем номера пользователя)

Это было бы намного более чисто, потому что класс меню был бы гибким, и вы могли бы легко добавлять новые страницы меню ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...