Рубиновый трюк: хэш как функция
В некоторых ситуациях вы можете рассматривать хэш как функцию, которая принимает аргумент (ключ хэша) и возвращает результат:
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 предположили, что использование термина замыкание здесь может ввести в заблуждение. Поэтому я удалил закрывающие части, чтобы избежать путаницы.