Рубиновый трюк: хэш как функция

В некоторых ситуациях вы можете рассматривать хэш как функцию, которая принимает аргумент (ключ хэша) и возвращает результат:

my_hash = {a: 11}
[:a, :b, :c].map &my_hash
#=> [11, nil, nil]

Итак, что же здесь особенного в хэше?

Ничего такого! как указал jrochkind на Reddit, любой объект, у которого есть метод to_proc, будет работать в таких ситуациях. Интерпретатор Ruby проверяет, является ли объект после `&` процедурой. Если это не так, он проверяет, есть ли у него метод `to_proc`, и если да, он преобразует объект в proc и продолжает работу.

Когда вы вызываете `to_proc` для хэша, он возвращает лямбду, которая принимает аргумент (ключ) и возвращает значение, связанное с этим ключом.

my_lambda = {a: 1, b: 2, c: 3}.to_proc
my_lambda.call :a
#=> 1

Изменить:

Первоначально эта статья называлась хэш как замыкание, но некоторые люди в этой ветке Reddit предположили, что использование термина замыкание здесь может ввести в заблуждение. Поэтому я удалил закрывающие части, чтобы избежать путаницы.