Прервитесь ненадолго и напишите программу, чтобы выяснить, что же возвращает 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 'Вам нравится есть бурритос?'
wetsBed = ask 'Вы мочитесь в постель?' значение.
# Мы сохраняем возвращаемое
ask 'Вам нравится есть чимичангас?'
ask 'Вам нравится есть сопапиллас?'
ask 'Вам нравится есть тамалес?'
puts 'И ещё несколько вопросов…'
ask 'Вам нравится пить хорчата?'
ask 'Вам нравится есть флаутас?'
puts
puts 'Спасибо за то…'
puts
puts wetsBed
Здравствуйте! И спасибо, что Вы…
Вам нравится есть такое?
да
Вам нравится есть бурритос?
да
Вы мочитесь в постель?
никогда!
Пожалуйста, отвечайте «да» или «нет».
Вы мочитесь в постель?
нет
Вам нравится есть чимичангас?
да
Вам нравится есть сопапиллас?
да
Вам нравится есть тамалес?
да
И ещё несколько вопросов…
Вам нравится пить хорчата?
да
Вам нравится есть флаутас?
да
ПОЯСНЕНИЕ:
Спасибо за то… false
Неплохо, а? Мы смогли добавить больше вопросов (ведь добавлять вопросы теперь легко), но наша программа к тому же ещё и стала немного короче! Это значительное усовершенствование – мечта каждого ленивого программиста.
Думаю, было бы очень полезно привести ещё один пример метода. Мы назовём его englishNumber. Он будет принимать число, например, 22, и возвращать его английское название (в данном случае, строку 'twenty–two'). Для начала, пусть он работает только с целыми числами от 0 до 100.
(ПРИМЕЧАНИЕ: Этот метод использует новую хитрость для преждевременного возврата из метода с помощью ключевого слова return, а также представляет новый поворот в ветвлении: elsif. Из контекста должно быть ясно, как они работают.)
def englishNumber number
# Нам нужны только числа в диапазоне 0-100. if number < 0
return 'Пожалуйста, введите число ноль или больше.' end
if number > 100
return 'Пожалуйста, введите число 100 или меньше.' end
numString = '' # Эту строку мы будем возвращать.
# «left» – сколько от числа нам ещё осталось вывести.
# «write» – часть числа, которую мы выводим сейчас.
# write и left… поняли? :) left = number
write = left/100 # Сколько сотен осталось вывести?
left = left – write*100 # Вычтем эти сотни.
if write > 0
return 'one hundred'
end
write = left/10
#
Сколько десятков осталось вывести?
left = left – write*10
#
Вычтем эти десятки.
if write > 0
if write == 1 # Охо-хо…
# Поскольку мы не можем вывести «tenty–two» вместо «twelve»,
# нам нужно сделать особые исключения для них. if left == 0
numString = numString + 'ten' elsif left == 1
numString = numString + 'eleven' elsif left == 2
numString = numString + 'twelve' elsif left == 3
numString = numString + 'thirteen' elsif left == 4
numString = numString + 'fourteen' elsif left == 5
numString = numString + 'fifteen' elsif left == 6
numString = numString + 'sixteen' elsif left == 7
numString = numString + 'seventeen' elsif left == 8
numString = numString + 'eighteen' elsif left == 9
numString = numString + 'nineteen' end
# Поскольку уже мы позаботились о цифре для единиц,
# нам не осталось ничего для вывода. left = 0
elsif write == 2
numString = numString + 'twenty' elsif write == 3
numString
= numString + 'thirty'
elsif write
= = 4
numString
= numString + 'forty'
elsif write
= = 5
numString
= numString + 'fifty'
elsif write
= = 6
numString
= numString + 'sixty'
elsif write
= = 7
numString
= numString + 'seventy'
elsif write
= = 8
numString
= numString + 'eighty'
elsif write
= = 9
numString
= numString + 'ninety'
end
if left > 0
numString
= numString + '–'
end