do..end против фигурных скобок
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 16 из 56.
Ruby предоставляет вам два способа написания блока. Они означают одно и то же, но у каждого есть предпочтительный вариант использования.
do...end предназначен для многострочных блоков:
[1, 2, 3].each do |n|
doubled = n * 2
puts "#{n} -> #{doubled}"
endФигурные скобки { ... } предназначены для однострочных блоков, коротких, в форме выражений:
[1, 2, 3].each { |n| puts n * 2 }У этих двух вариантов немного разный приоритет, но правило, которое нужно знать учащимся, касается стиля: фигурные скобки для однострочников, do...end для многострочных блоков.
Обе формы могут возвращать значение. Последнее выражение блока — это то, что возвращается в такие методы, как map:
[1, 2, 3].map { |n| n * 10 } # [10, 20, 30]
[1, 2, 3].map do |n|
n * 10
end # [10, 20, 30]Задание
ЛегкоПрочитайте из входных данных список целых чисел, разделенных запятыми. Выведите две строки:
- Каждое число, умноженное на два, объединенное через
,. Используйте формуmapс фигурными скобками. - Строку
"<n> squared is <n*n>"для каждого числа, по одной на строку. Используйте формуeachсdo...end.
Для входных данных 1,2,3 вывод будет следующим:
2, 4, 6
1 squared is 1
2 squared is 4
3 squared is 9Шпаргалка
Блоки в Ruby имеют два варианта синтаксиса:
Фигурные скобки { ... } для однострочных блоков:
[1, 2, 3].map { |n| n * 2 } # [2, 4, 6]do...end для многострочных блоков:
[1, 2, 3].each do |n|
doubled = n * 2
puts "#{n} -> #{doubled}"
endОбе формы возвращают результат последнего выражения в блоке (используется такими методами, как map).
Попробуйте сами
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: строка 1, удвоенная, форма map с фигурными скобками, объединена через ", "
# TODO: строки 2..n, квадраты, форма each с do...end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Обзор методов строкИнтерполяция строкИтерация по строкамSplit и JoinИтоги — String Weaver4Блоки, Proc и лямбды
Что такое блок?do..end против фигурных скобокКлючевое слово yieldПараметры блокаProc и лямбдыИтоги: пользовательский итератор7Хеши. Часть 2
Hash.new со значениями по умолчаниюИтерация по хешамВложенные хешиСлияние и преобразованиеИтоги — счетчик частоты10Проект — Учёт студентов
Обзор проектаДобавить студента2Диапазоны
Что такое диапазон?Методы диапазоновДиапазоны в Case / WhenПовторение — практика по диапазонам5Мощь Enumerable
Select и RejectЦепочки MapReduce / Injectcount, all?, any?, none?group_by и partitionsort_by, min_by, max_byИтоги — Data Pipeline8Продвинутые условные конструкции
Case с классами и RegexМножественные значения в whenТернарный операторОднострочные if / unlessПовторение: Классификатор оценок