[#] Использование send для удобства, от безысходности и ради развлечения
habrabot(difrex,1) — All
2016-12-27 23:00:08


![][1]
[Один из методов][2] библиотеки Sidekiq. [Объяснение смайла][3]



_send_ в Ruby вызывает методы объектов по имени. Вот очевидный способ применения:


# До: явно используем присваивание. Неудобно, если полей много или они определяются в рантайме.
user.name = "Иван"
user.age = 29

# После: передаём имя атрибута параметром. Решает проблемы первого способа.
def set(field, value)
send("#{field}=", value)
end
user.set(:name, "Иван")
user.set(:age, 29)

А ещё вы наверняка видели такие строки:


after_create :send_email

Да-да, коллбэки в рельсах внутри реализованы [тоже с помощью send][4].


[Что ещё умеет send?][5]

[1]: https://habrastorage.org/files/c89/9b2/547/c899b254775440adbb76027708707360.png
[2]: https://github.com/mperham/sidekiq/blob/b63a8571524e1e505c93c97c2bdb1c352f845064/lib/sidekiq.rb#L51
[3]: http://stackoverflow.com/questions/23975346/why-is-%E2%95%AF%C2%B0%E2%96%A1%C2%B0-%E2%95%AF-%E2%94%BB%E2%94%81%E2%94%BB-with-such-an-encoding-used-for-a-method-name
[4]: https://github.com/rails/rails/blob/38fe5ae24476ef8808d5eb6366afe84ff43a3279/activesupport/lib/active_support/callbacks.rb#L432
[5]: https://habrahabr.ru/post/318546/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut