2013-06-04 3 views
0

Код ниже работает полностью нормально, пока пользователи вводят имя метода. Я бы хотел, чтобы пользователи не вводили имя метода в различные запросы get.chomp.Ruby, Convert String Queries В вызовы метода

Я думал, что использование оператора case для перевода пользовательского ввода в вызовы методов будет работать, но я продолжаю получать .include? Ошибка NoMethodDefined.

class Foo 

    def initialize(start_action) 
    @start = start_action 
    end 

    def play 
    next_action = @start 
    while true 
     case next_action.include? 
     when beginning 
     next_action = beginning 
     when "instruct" 
     next_action = instructions # returns instructions as 
            # the method that's called below 
     when "users" 
     next_action = users # returns users as the 
          # method that's called below 
     else 
     puts "Unknown command." 
     next_action = # some placeholder method call that gets the user 
         # back to being able to make another choice 
     end 
     puts "\n----------" 
     next_action = method(next_action).call 
    end 

    def beginning 
    puts "This is the beginning." 
    next_action = gets.chomp 
    end 

    def instructions 
    puts "These are the instructions" 
    # code to display instructions omitted 
    next_action = gets.chomp 
    end 

    def users 
    puts "Here are your users" 
    # code to display users omitted 
    next_action = gets.chomp 
    end 

end 

start = Foo.new(:beginning) 
start.play 

Любые советы или помощь.

ответ

0

На первом проходе через вашу петлю next_action является символом :beginning, а символы не имеют метода include?.

Кроме того, я думаю, вы поняли, как работают заявления случае - даже удаление первой ошибки код будет жаловаться, что вы передаете 0 аргументы include? (вместо 1)

Я думаю, что вместо этого вы имели в виду что-то вроде

case next_action 
when /instruct/ 
    .. 
when /users 
    .. 
else 
    .. 
end 

Что испытают очередную акцию против каждой очередной репрессии в свою очередь

+0

Ах, да. Имеет смысл. Итак, теперь я рефакторинг по вашему предложению, и я больше не получаю NoMethodError, но я, кажется, сломал цикл while. И это не признает «инструктаж» или «пользователей» действительными. Все, что я получаю, это одна Неизвестная команда, затем все, что вводится в следующее приглашение, завершает процесс. Я ожидаю, что вас снова вернут в цикл. – user2448377

+0

Ваш текущий код не похож, что он когда-либо будет называть метод начала –

+0

Я исправил оператор case, чтобы включить начало в качестве опции. Это на самом деле первый метод, который называется, да? Когда Foo инициализируется? Несмотря на это, даже если я набираю один из других вариантов, оператор case не распознает их. Все, что я получаю, это параметр Unknown Command. Я наберу [пользователей] в приглашении (без скобок), и аргумент case считает, что это нехорошо. – user2448377