获取动态定义的方法的源代码

时间:2017-10-05 08:14:42

标签: ruby

如果任何方法的源明确写在文件中,there is一个简洁的方法来显示代码:

A.instance_method(:foo).source

但如果我使用

在其dynamically中定义类和方法
Object.const_set(dynamic_name, Class.new { def foo() puts 'bar' end })

我在尝试获取此方法的来源时收到错误,在这种情况下使用instance_method(:foo).source

MethodSource::SourceNotFoundError: Could not load source for : No such file or directory @ rb_sysopen - (eval)

如何获得动态定义方法的来源?它有可能吗?

1 个答案:

答案 0 :(得分:3)

至少,您可以获得字节码(假设您使用MRI)

puts RubyVM::InstructionSequence.disasm(A.instance_method(:foo))
# >> == disasm: #<ISeq:foo@->================================================
# >> 0000 trace            8                                               (   3)
# >> 0002 trace            1
# >> 0004 putself          
# >> 0005 putstring        "bar"
# >> 0007 opt_send_without_block <callinfo!mid:puts, argc:1, FCALL|ARGS_SIMPLE>, <callcache>
# >> 0010 trace            16
# >> 0012 leave