Ruby неопределенный метод, но метод существует - PullRequest
1 голос
/ 05 апреля 2020

Я очень плохо знаком с ruby, и я создаю приложение CLI, но я получаю неопределенную ошибку метода для red_meat, и я близок к тому, чтобы раздражаться. Как бы я определил этот метод, если он уже определен или я так думал?

def menu
    puts "Are you interested in finding some delicious recipes?"
    puts ""
    puts "Enter yes or no"
    case (gets.chomp.downcase)
    when 'no'
      puts "Aww you missed out on some yummy meals. Thank you for dropping by"
    when 'yes'
      puts "Great! Enter one of the following options (Red meat, Poultry, Seafood or Vegetarian)"
      #case (gets.chomp.downcase)
      input = gets.strip.downcase
      if input = "red meat"
        red_meat
      end
    else
      puts "I'm sorry, are you hangry? Please try again"
      puts ""
      menu
    end

    def red_meat
      puts "red meat recipe 1"
      puts "red meat recipe 2"
      puts "red meat recipe 3"
      puts "red meat recipe 4"
    end 

Ошибка

ERROR: 
cli.rb:22:in `menu': undefined method `red_meat' for #<RecipesCli::CLI:0x00007fd941914228> (NoMethodError)

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Как видно из отступа в вашем коде, определение метода для read_meat вложено внутри определения метода menu.

Это означает определение метода будет выполняться только при первом вызове menu. (На самом деле, он будет выполняться каждый раз, когда вы выполняете menu, всегда перезаписывая red_meat снова и снова).

Однако, поскольку определение метода находится на end из menu в строке 21, метод еще не будет определен при вызове в строке 13.

Вот упрощенный пример:

def menu
  red_meat

  def red_meat; end
end

menu
# NameError …

Когда вы переместите определение метода до вызова, оно работает (упрощенный пример):

def menu
  def red_meat; end

  red_meat
end

menu

Однако я предполагаю, что вы на самом деле не хотели определять red_meat внутри menu, так что вы вероятно, нужно что-то вроде этого:

def menu
  red_meat
end

def red_meat; end

menu

Нет необходимости определять red_meat перед определением menu. В конце концов, определение menu не вызывает read_meat, только вызывает menu, вызывает red_meat. Таким образом, все, что вам нужно, это убедиться, что red_meat определено до того, как вы позвоните menu.

Подсказка: если вы используете редактор с автоматическим c форматированием кода, вы бы сразу же обратите внимание, что def red_meat имеет отступ относительно def menu, указывая, что определение red_meat вложено в тело menu.

Примечание. В вашем код.

0 голосов
/ 05 апреля 2020

Вы должны сначала определить свой метод, чтобы иметь возможность вызывать его позже. Внутри или снаружи вашего menu метода.

def red_meat
    puts "red meat recipe 1"
    puts "red meat recipe 2"
    puts "red meat recipe 3"
    puts "red meat recipe 4"
end 

def menu
    puts "Are you interested in finding some delicious recipes?"
    puts ""
    puts "Enter yes or no"
    case (gets.chomp.downcase)
    when 'no'
      puts "Aww you missed out on some yummy meals. Thank you for dropping by"
    when 'yes'
      puts "Great! Enter one of the following options (Red meat, Poultry, Seafood or Vegetarian)"
      #case (gets.chomp.downcase)
      input = gets.strip.downcase
      if input = "red meat"
        red_meat
      end
    else
      puts "I'm sorry, are you hangry? Please try again"
      puts ""
      menu
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...