Вам нужно переместить строки
puts 'Say something nice to Grandma.'
puts 'You may need to shout > '
speak = gets.strip
counter = 0
speaks(speak)
после определения вашего метода, чтобы метод speaks
был определен при достижении строки speaks(speak)
.
Тогда следующая проблема, с которой вы, вероятно, столкнетесь, будет
in `exitPlan': undefined method `+' for nil:NilClass
Это потому, что counter
- локальная переменная, поэтому она не используется совместно вашим кодом верхнего уровня и различными методами. Для этого вам нужно будет либо использовать глобальную переменную, т.е. $counter
, либо, что лучше, поместить различные методы в класс, а затем использовать переменную экземпляра.
Я подозреваю, что в вашем коде все еще есть некоторые проблемы, например, вы, кажется, звоните gets.strip
, чтобы получить ввод только один раз. Однако с точки зрения переноса кода внутри класса это не тот счетчик, который вы хотите обернуть, так как вам все равно придется передавать его между различными методами. Это целое взаимодействие говорить / говорить, так что-то вроде
class Grandma
def initialize
@counter = 0
end
def speaks(speak)
..
end
def talk()
..
end
def exitPlan()
..
end
end
grandma = Grandma.new
grandma.speaks(speak)
и замените места, где вы используете локальную переменную counter
ссылками на @counter