Everything is an Object. I mean, everything.
Ничего принципиально нового, но познавательно.
Писал к одной программе плагин на Ruby. API не предполагает вообще никакого ООП, и заворачивание функций скрипта в модуль или класс было бы пустой тратой LOC. В то же время с плагином можно было общаться через пайп, и существовала потребность вызывать функции плагина извне.
Решение:
195 def invoke(arg_procname)
196 send(:"#{arg_procname}")
198 end
196 send(:"#{arg_procname}")
198 end
А теперь помедленнее, я записываю.
1. Всё - объект. Даже не так, всё - Object, в том числе (неявно) и скрипт:
16 puts send(:class).to_s #=>Object
17 puts inspect #=>main
17 puts inspect #=>main
2. У класса Object есть метод send(sym), принимающий в качестве аргумента символ с именем метода, который нужно вызвать.
3. Символы могут быть созданы с помощью синтаксиса :"symbolname"
4. "symbolname" - строка, и в ней возможны подстановки.
Итого: внешний мир пишет в именованный пайп (как вариант - в сокет) имя желаемой процедуры, объект скрипта main вызывает её как собственный метод.
2 комментария:
Очень изящно! Есть в руби своя прелесть.
На то он и динамический язык. Вот доберусь до функциональных...
Отправить комментарий