如果任何方法的源明确写在文件中,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)
如何获得动态定义方法的来源?它有可能吗?
答案 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