Сначала давайте взглянем на to_s и join. Метод join работает во многом схоже с методом to__ s, за исключением того, что он добавляет строку между объектами массива. Давайте посмотрим:
foods = ['артишок',
'бриошь',
'карамель']
puts foods
puts
puts foods.to s
puts
puts foods.join(',
')
puts
puts foods.join('
:) ') + '
8) '
200.times do
puts[]
end
артишок
бриошь
карамель
артишокбриошькарамель
артишок, бриошь, карамель
артишок :) бриошь :) карамель 8)
Как видите, метод puts обращается с массивами не так, как с другими объектами: он просто вызывает puts для каждого из объектов в массиве. Вот почему вывод через puts пустого массива 200 раз ничего не делает: массив ни на что не указывает, так что нечего выводить с помощью puts. (Ничего не делать 200 раз – значит всё равно ничего не делать.) Попробуйте вывести методом puts массив, содержащий другие массивы: он делает то, что вы ожидали?
Кроме того, вы заметили, что я не употреблял в puts пустые строки, когда хотел вывести чистую строку? Получилось то же самое.
Теперь давайте посмотрим на push, pop и last. Методы push и pop в каком-то смысле противоположны, как + и -. push добавляет объект в конец вашего массива, а pop удаляет последний объект из массива (и сообщает вам, что это был за объект). last похож на pop в том, что он сообщает вам, что находится в конце массива, только он оставляет массив нетронутым. Повторю снова: push и pop действительно изменяют массив:
favorites = []
favorites.push
'капли дождя на розах'
favorites.push
'капли виски на котах'
puts
favorites[0]
puts
favorites
. last
puts
favorites
.length
puts
favorites
.pop
puts
favorites
puts
favorites
.length
капли
дождя
на
розах
капли
виски
на
котах
2
капли
виски
на
котах
капли
дождя
на
розах
1
Попробуйте ещё кое-что
• Напишите программу, о которой мы говорили в самом начале этой главы.
Подсказка: Есть прекрасный метод массива, который вернёт вам отсортированную версию массива: sort. Используйте его!
• Попробуйте написать указанную программу без использования метода sort. Большая часть программирования – это преодоление сложностей, так что практикуйтесь чаще, насколько это возможно!
• Перепишите вашу программу «Содержание» (из главы о методах). Начните программу с массива, содержащего всю информацию для вашей таблицы с содержанием (названия глав, номера страниц и т. д.). Затем напечатайте информацию из массива в виде красиво отформатированного содержания.
До сих пор мы изучили довольно много разных методов. А сейчас пора научиться, как сделать свои собственные.
8. Пишем свои методы
Как мы уже видели, циклы и итераторы позволяют нам делать одно и то же (выполнять тот же самый код) снова и снова. Однако, иногда мы хотим сделать одно и то же несколько раз, но в разных частях программы. Например, мы бы разрабатывали, скажем, программу опроса для студента-психолога. Судя по разговорам со знакомыми студентами-психологами и по опросам, которые они мне предлагали, она, наверное, должна быть примерно такой:
puts 'Здравствуйте! И спасибо, что Вы нашли время, чтобы'
puts 'помочь мне в этом исследовании. Мое исследование'
puts 'связано с изучением того, как люди относятся к'
puts 'мексиканской еде. Просто думайте о мексиканской еде'
puts 'и попробуйте отвечать на все вопросы честно,'
puts 'только словами «да» или «нет». Моё исследование'
puts 'не имеет ничего общего с ночным недержанием мочи.' puts
# Мы задаём эти вопросы, но игнорируем ответы на них. goodAnswer = false while (not goodAnswer)
puts 'Вам нравится есть такос?' answer = gets.chomp.downcase if (answer == 'да' or answer == 'нет') goodAnswer = true else
puts 'Пожалуйста, отвечайте «да» или «нет».' end end
goodAnswer = false while (not goodAnswer)
puts 'Вам нравится есть бурритос?' answer = gets.chomp.downcase if (answer == 'да' or answer == 'нет')
goodAnswer = true
else
puts 'Пожалуйста, отвечайте «да» или
«нет».'
end
end
# Мы, однако, обращаем внимание на *этот
* вопрос.
goodAnswer = false
while (not goodAnswer)
puts 'Вы мочитесь в постель?'
answer = gets.chomp.downcase
if (answer == 'да' or answer == 'нет')
goodAnswer = true
if answer == 'да'
wetsBed = true
else
wetsBed = false
end
else
puts 'Пожалуйста, отвечайте «да» или
«нет».'
end
end
goodAnswer = false
while (not goodAnswer)
puts 'Вам нравится есть чимичангас?'
answer = gets.chomp.downcase
if (answer == 'да' or answer == 'нет')
goodAnswer = true
else
puts 'Пожалуйста, отвечайте «да» или
«нет».'
end
end
puts 'И ещё несколько вопросов…'
goodAnswer = false while (not goodAnswer)
puts 'Вам нравится есть сопапиллас?' answer = gets.chomp.downcase if (answer == 'да' or answer == 'нет') goodAnswer = true else
puts 'Пожалуйста, отвечайте «да» или «нет».' end end
# Задайте много других вопросов о мексиканской еде. puts
puts 'ПОЯСНЕНИЕ:'
puts 'Спасибо за то, что Вы нашли время, чтобы помочь'
puts 'этому исследованию. На самом деле, это исследование'
puts 'не имеет ничего общего с мексиканской едой. Это'
puts 'исследование ночного недержания мочи. Мексиканская еда'
puts 'присутствовала только затем, чтобы усыпить Вашу бдительность'