doubleThis 44 puts numTimes2.to_s 44 дважды будет 88
#
[#<Ошибка имени: неопределённая локальная переменная или метод 'numTimes2' для #
Неопределённая локальная переменная… Фактически, мы определили эту локальную переменную, но она не является локальной там, где мы попытались её использовать; она локальная внутри метода.
Это может показаться неудобным, но на самом деле это очень даже приятно. Хотя это означает, что у вас нет доступа к переменным внутри методов, это также означает, что у них нет доступа к вашим переменным, и, таким образом, их нельзя испортить:
def littlePest var var = nil
puts 'ХА–ХА! Я уничтожил твою переменную!' end
var = 'Ты не можешь даже притронуться к моей переменной!' littlePest var puts var
ХА-ХА! Я уничтожил твою переменную!
Ты не можешь даже притронуться к моей переменной!
Фактически, в этой маленькой программе две переменные var, а именно: та, что внутри метода littlePest, и та, что вне его. Когда мы вызвали littlePest var, мы в действительности просто передали строку из одной переменной var в другую так, что обе указывали на одну и ту же строку. Затем в методе littlePest его собственная локальная var стала указывать на nil, но это не повлияло на var вне метода.
Возвращаемые значения
Должно быть, вы заметили, что некоторые методы возвращают вам что-нибудь, когда вы их вызываете. Например, gets возвращает строку (ту строку, что вы ввели с клавиатуры), а метод + в выражении 5+3, (а это на самом деле 5. + (3)) возвращает 8. Арифметические методы чисел возвращают числа, а арифметические методы строк возвращают строки.
Важно понять отличие между методами, возвращающими значение туда, где этот метод был вызван, и выводом вашей программой информации на экран монитора, как
А что же тогда возвращает puts? Мы никогда до этого не задумывались об этом, но давайте взглянем сейчас:
returnVal = puts puts returnVal
'Это вернул метод puts:'
Это вернул метод nil
puts:
Итак, первый puts вернул nil. И хотя мы этого не проверяли, второй puts вернул то же; puts всегда возвращает nil. Каждый метод должен возвращать что-нибудь, даже если это просто nil.
Прервитесь ненадолго и напишите программу, чтобы выяснить, что же возвращает sayMoo.
Вы удивлены? Хорошо, вот как это всё работает: значение, возвращаемое из метода,
– это просто значение последней строки метода. В случае с sayMoo это означает, что он возвращает puts 'мууууууу… '*numberOfMoos, то есть просто nil, поскольку puts всегда возвращает nil. Если бы мы хотели, чтобы все наши методы возвращали строку 'жёлтая подводная лодка', нам бы просто нужно было поместить это в конце каждого из них:
def sayMoo numberOfMoos
puts 'мууууууу…'*numberOfMoos 'жёлтая подводная лодка' end
x = sayMoo 2 puts x
мууууууу…мууууууу… жёлтая подводная лодка
Итак, давайте снова вернёмся к нашему психологическому исследованию, но на этот раз мы напишем метод, который будет задавать для нас вопросы. Нужно, чтобы он принимал вопрос в качестве параметра и возвращал true, если ответ был да, или false, если ответ был нет. (Даже если в большинстве случаев мы просто игнорируем ответ, всё равно это неплохая идея, чтобы наш метод возвращал результат. Поступая так, мы сможем использовать его и для вопроса о ночном недержании.) Я также собираюсь сократить приветствие и пояснение просто для того, чтобы программу было легче читать:
def ask question # задать вопрос
goodAnswer = false
while (not goodAnswer)
puts question
reply = gets.chomp.downcase
if (reply == 'да' or reply == 'нет
)
goodAnswer = true
if reply == 'да'
answer = true
else
answer = false
end
else
puts 'Пожалуйста, отвечайте «да»
или «нет».'
end
end
answer # Это то, что мы возвращаем
(true или false).
end
puts 'Здравствуйте! И спасибо, что Вы.
puts
ask 'Вам нравится есть такос?' # Мы игнорируем возвращаемое значение.
ask 'Вам нравится есть бурритос?'