?

Log in

Thu, Sep. 27th, 2012, 07:44 pm
sontar: Интроспекция модуля

А вот, господа рубисты, такой вопрос:

Есть модуль и метод в нём:

module Foo
  def bar
  # do something
  end
end


1. как получить список методов в модуле Foo?
2. как получить доступ к методу Foo::bar, чтобы скопировать его в лямбду и, например, выполнить где-нибудь над ним instance_eval?

---
UPD. с первым разобрался: Foo.instance_methods

Thu, Sep. 27th, 2012 09:11 am (UTC)
strock

В 1.9 появилась такая штука http://www.ruby-doc.org/core-1.9.3/UnboundMethod.html. Т.е. Foo.instance_method(:bar) и потом его можно куда-нибудь прибиндить и вызвать.

Thu, Sep. 27th, 2012 09:29 am (UTC)
sontar

совсем куда-нибудь не получается, требует тот же модуль

Thu, Sep. 27th, 2012 09:45 am (UTC)
strock

Есть еще всякие костыли для получения исходника метода на лету, например https://github.com/banister/method_source или https://github.com/ngty/sourcify, но это куда-то не в ту степь. Еще можно же делать так:


1.9.3p125 :013 > module Foo; def self.bar; 'a'; end end
=> nil
1.9.3p125 :014 > Foo.method(:bar)
=> #<Method: Foo.bar>
1.9.3p125 :015 > Foo.method(:bar).to_proc
=> #<Proc:0x8dba0bc (lambda)>
1.9.3p125 :016 > p = Foo.method(:bar).to_proc
=> #<Proc:0x89fed24 (lambda)>
1.9.3p125 :017 > p.call
=> "a"
</plaintext>

Edited at 2012-09-27 09:47 am (UTC)

Thu, Sep. 27th, 2012 09:51 am (UTC)
sontar

self.bar - не то пальто

Thu, Sep. 27th, 2012 09:58 am (UTC)
strock

Кажется, извернулся.


1.9.3p125 :001 > module Foo; def bar; 'a' end end
=> nil
1.9.3p125 :002 > m = Foo.instance_method(:bar)
=> #<UnboundMethod: Foo#bar>
1.9.3p125 :003 > m.bind(Class.new.send(:include, m.owner).new).to_proc.call
=> "a"


Edited at 2012-09-27 09:59 am (UTC)