Последние дни мы с Карлом работали над системой плагинов. В частности, мы прошлись по Rails Plugin Guide. Читая гайд, мы заметили много излишеств в представленных там идиомах.
Я не упрекаю автора гайда; представленные идиомы в точности повторяют те, которые использовались с самых ранних дней Rails. С другой стороны, глядя на них я вспоминал те дни, когда при виде такого кода мне казалось, что Ruby полон магических заклинаний и относительно простые вещи требуют проведения каких-то особых церемоний (вроде танца с бубном. — Прим. перев.).
Вот пример:
Copy Source | Copy HTML<br/>module Yaffle<br/> def self.included(base)<br/> base.send :extend, ClassMethods<br/> end<br/> <br/> module ClassMethods<br/> # любой метод здесь будет применяться классом, например, Hickwall<br/> def acts_as_something<br/> send :include, InstanceMethods<br/> end<br/> end<br/> <br/> module InstanceMethods<br/> # любой метод тут будет применяться экземпляром, например, @hickwall<br/> end<br/>end <br/>
Начнем с того, что send вообще не нужен. Метод
acts_as_something
будет вызываться в самом классе, что даст ему доступ к приватному методу include
.