Як працює &:to_s у Ruby і що таке Symbol#to_proc

ЗмістНатисність на посилання, щоб перейти до потрібного місця
У 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 дуже зручна для колекцій, коли потрібно викликати один метод на всіх елементах.

Цей допис поки що не має жодних доповнень від автора/ки.

Як працюють масиви в Ruby: практичні приклади each, map, select, inject, reduce, filter_map
28 жовт., 10:38

Як працюють масиви в Ruby: практичні приклади each, map, select, inject, reduce, filter_map

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Як працює self, protected і private (Ruby)
28 жовт., 13:52

Як працює self, protected і private (Ruby)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Цілочисельне ділення у Ruby: чому 6 / 4 дорівнює 1
28 жовт., 14:10

Цілочисельне ділення у Ruby: чому 6 / 4 дорівнює 1

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке Proc і Lambda в Ruby?
28 жовт., 15:57

Що таке Proc і Lambda в Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що відбувається, якщо викликати [1, 2, 3].map(&Person)
29 жовт., 17:54

Що відбувається, якщо викликати [1, 2, 3].map(&Person)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Singleton class (eigenclass) у Ruby: що це і навіщо потрібно
29 жовт., 18:29

Singleton class (eigenclass) у Ruby: що це і навіщо потрібно

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
==, equal?, eql?, === у Ruby: що перевіряють і коли використовувати
29 жовт., 20:47

==, equal?, eql?, === у Ruby: що перевіряють і коли використовувати

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Include, Extend, Prepend у Ruby: як вони працюють і в чому різниця
29 жовт., 21:20

Include, Extend, Prepend у Ruby: як вони працюють і в чому різниця

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
module_function у Ruby: коли методи модуля доступні як модульні та як функції
29 жовт., 21:53

module_function у Ruby: коли методи модуля доступні як модульні та як функції

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska