ЗмістНатисність на посилання, щоб перейти до потрібного місця
У Ruby часто зустрічається скорочений запис для ітерацій:
[1, 2, 3].map(&:to_s)
Це те саме, що:
[1, 2, 3].map { |n| n.to_s }
Але як саме працює конструкція &:to_s?
Symbol#to_proc
Ключова ідея полягає в тому, що Ruby дозволяє перетворювати символи на блоки за допомогою методу to_proc.
- Символ :to_s представляє ім’я методу.
- Метод to_proc перетворює символ на блок, який викликає відповідний метод на кожному елементі колекції.
- Оператор & повідомляє Ruby, що цей блок треба передати у метод (map, each тощо).
Можна побачити це так:
s = :to_s p = s.to_proc [1, 2, 3].map(&p) # => ["1", "2", "3"]
Тобто &:to_s — це скорочений запис для &(:to_s.to_proc)
Якщо просто:
Коли ми пишемо &:to_s, він бере кожен елемент масиву і викликає на ньому метод to_s.
Тобто цей запис:
[1, 2, 3].map(&:to_s)
означає те саме, що:
[1, 2, 3].map { |n| n.to_s }
&:to_s - це просто короткий спосіб сказати "виклич метод to_s на кожному елементі". Ruby сам "розгортає" цей символ у звичайний блок.
Приклади
1. Перетворення чисел на рядки
numbers = [1, 2, 3] strings = numbers.map(&:to_s) # => ["1", "2", "3"]
2. Виклик інших методів
words = ["hello", "world"] capitalized = words.map(&:upcase) # => ["HELLO", "WORLD"]
3. Виклик власних методів об’єкта
class Person
attr_reader :name
def initialize(name)
@name = name
end
end
people = [Person.new("Alice"), Person.new("Bob")]
names = people.map(&:name)
# => ["Alice", "Bob"]
Як любить писати ШІ - Висновок:
- &:method_name - це скорочений запис для &(:method_name.to_proc).
- Ruby перетворює символ на блок за допомогою Symbol#to_proc, який викликає метод на кожному елементі колекції.
- Це робить код коротшим і більш читабельним.
Конструкція &:to_s або &:name дуже зручна для колекцій, коли потрібно викликати один метод на всіх елементах.
Цей допис поки що не має жодних доповнень від автора/ки.