Главная страница » Ruby » 9. Блоки
Блоки — это важная концепция в Ruby, позволяющая группировать код и передавать его в методы. Они используются для определения анонимных функций и часто применяются в методах для выполнения кода в определённом контексте. В этом уроке мы рассмотрим, что такое блоки, как их использовать, и какие особенности работы с ними есть в Ruby.
Блоки — это фрагменты кода, которые можно передавать в методы и выполнять внутри этих методов. Блоки могут быть использованы для выполнения повторяющихся задач, таких как обход коллекций или выполнение действий с элементами коллекции.
Синтаксис блока:
				
					# Блок с двумя параметрами
method_name do |param1, param2|
  # код блока
end
# Блок с использованием фигурных скобок
method_name { |param1, param2| 
  # код блока 
}
 
				
			
		Блоки передаются методам в качестве аргументов. Они могут быть использованы для выполнения кода в контексте вызова метода.
Пример использования блока в методе:
				
					def greet
  yield  # Вызов блока
end
greet do
  puts "Hello, world!"
end
 
				
			
		Здесь метод greet вызывает переданный блок с помощью yield, и код внутри блока выполняется.
Блоки могут принимать параметры, которые могут быть использованы внутри блока.
Пример передачи параметров в блок:
				
					def calculate(a, b)
  yield(a, b)  # Передача параметров в блок
end
calculate(5, 3) do |x, y|
  puts x + y  # Выводит сумму x и y
end
 
				
			
		Здесь метод calculate передает параметры a и b в блок, который выполняет операцию сложения.
Многие стандартные методы в Ruby принимают блоки для выполнения действий с элементами коллекций, таких как массивы и хэши.
Примеры использования блоков с коллекциями:
				
					# Применение блока к каждому элементу массива
[1, 2, 3].each do |number|
  puts number * 2
end
# Применение блока к каждому ключу и значению хэша
{a: 1, b: 2, c: 3}.each do |key, value|
  puts "#{key}: #{value}"
end
 
				
			
		Вы можете вернуть значение из блока, и это значение может быть использовано в методе, который принимает блок.
Пример возврата значения из блока:
				
					def square
  result = yield
  puts "Результат: #{result}"
end
square { 4 * 4 }  # => Результат: 16
 
				
			
		В этом примере блок возвращает результат операции, который затем используется в методе square.
ProcОбъекты класса Proc также представляют собой фрагменты кода, которые можно хранить и передавать. Proc позволяет сохранить блок в переменной и вызывать его позже.
Пример использования Proc:
				
					# Создание объекта Proc
my_proc = Proc.new { |x| puts x * 2 }
# Вызов Proc
my_proc.call(5)  # => 10
 
				
			
		Здесь блок сохраняется в объекте Proc и вызывается с помощью метода call.
yieldЕсли в методе не передан блок, попытка вызвать yield вызовет ошибку. Убедитесь, что блок действительно передан в метод.
Пример ошибки:
				
					def greet
  yield
end
greet  # Ошибка, так как блок не передан
 
				
			
		Если блок ожидает параметры, а метод yield не передает их, это приведет к ошибке.
Пример ошибки:
				
					def calculate
  yield
end
calculate do |x, y|
  puts x + y  # Ошибка, так как параметры не переданы
end
 
				
			
		В этом примере блок ожидает параметры x и y, но метод calculate не передает их.
Блоки — это мощный инструмент в Ruby, позволяющий гибко управлять выполнением кода. Они позволяют передавать фрагменты кода в методы, использовать их для обработки коллекций и возвращать значения. Понимание работы с блоками и правильное использование их возможностей поможет писать более эффективный и читаемый код.
Напишите метод repeat, который принимает строку и число, и повторяет строку указанное количество раз, выводя каждое повторение на новой строке. Используйте блок для вывода каждой строки.
Напишите метод filter_even, который принимает массив чисел и блок. Метод должен возвращать новый массив, содержащий только четные числа из исходного массива, обработанные блоком.
Пример решения:
				
					def repeat(text, times)
  times.times do
    yield text
  end
end
def filter_even(numbers)
  numbers.select { |number| yield(number) }
end
# Примеры вызова методов
repeat("Hello!", 3) { |message| puts message }
even_numbers = filter_even([1, 2, 3, 4, 5, 6]) do |number|
  number.even?
end
puts even_numbers.inspect  # => [2, 4, 6]
 
				
			
		Проверьте свою программу, чтобы убедиться, что она правильно выполняет все операции и обрабатывает возможные ошибки.
Телефон: +375 33 910-08-92 
Email: info@codefor.tech
Адрес: г. Барановичи, ул. Пирогова, д. 7
© 2024-2025 Все права защищены. CodeFor.
 
													Язык сайта: