Как видно из отступа в вашем коде, определение метода для 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
.
Примечание. В вашем код.