24 января 2008

Вот тебе, бабушка, и RPC


Everything is an Object. I mean, everything.

Ничего принципиально нового, но познавательно.
Писал к одной программе плагин на Ruby. API не предполагает вообще никакого ООП, и заворачивание функций скрипта в модуль или класс было бы пустой тратой LOC. В то же время с плагином можно было общаться через пайп, и существовала потребность вызывать функции плагина извне.
Решение:

195 def invoke(arg_procname)
196   send(:"#{arg_procname}")
198 end

А теперь помедленнее, я записываю.
1. Всё - объект. Даже не так, всё - Object, в том числе (неявно) и скрипт:

16 puts send(:class).to_s  #=>Object
17 puts inspect            #=>main 


2. У класса Object есть метод send(sym), принимающий в качестве аргумента символ с именем метода, который нужно вызвать.
3. Символы могут быть созданы с помощью синтаксиса :"symbolname"
4. "symbolname" - строка, и в ней возможны подстановки.

Итого: внешний мир пишет в именованный пайп (как вариант - в сокет) имя желаемой процедуры, объект скрипта main вызывает её как собственный метод.

2 комментария:

jetxee комментирует...

Очень изящно! Есть в руби своя прелесть.

PhoeniX комментирует...

На то он и динамический язык. Вот доберусь до функциональных...