Выбрать главу

Сначала давайте взглянем на 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 'присутствовала только затем, чтобы усыпить Вашу бдительность'