我想做以下事情:
class String
def fancy_thing appendix
# Just a trivial example to ensure self and params work.
# Pretend this is something complex.
self.reverse + appendix
end
end
# print_method on instance or class should spit out a string
# containing the actual code for that method
ft_code = "cob".print_method :fancy_thing
ft_code = String.print_instance_method :fancy_thing
# => "{|appendix| self.reverse + appendix }" *
# ft_code gets passed around a bit...
# exec on an object should run code (w/ parameters) as if that code is
# an instance method on that object (or class method if it's a class)
"cob".exec(ft_code, '!') #=> "boc!"
如何编码print_method和foo.exec?优选地,它们应该适用于任何任意方法,而不必事先知道它们可能恰好定义或来源于何处。
答案 0 :(得分:7)
parse_tree将为您提供所需的关键步骤:
http://github.com/seattlerb/parsetree/tree/master
我认为这是以最快/最黑/最不安全的方式做到的:
require 'parse_tree'
require 'parse_tree_extensions'
require 'ruby2ruby'
class Object
def method_source(name)
(class << self; self; end).instance_method(name).to_ruby
end
def exec(ruby, *args)
code = eval(ruby, binding)
code.call(*args)
end
end
我要补充一点,我很难看出这是一个好主意......但是你有它。 : - )
[编辑]
另请注意,您的示例已被破坏:您的'fancy_thing'方法需要参数(附录)。
[编辑2]
超越顶部,这是修复了错误的测试代码(我认为你想要的方式):
class String
def fancy_thing(appendix)
reverse << appendix || nil
end
end
code = "cob".method_source :fancy_thing
# => "proc {|appendix| reverse << appendix }" *
"cob".exec code, '!'
# => "boc!"
答案 1 :(得分:0)
如果不阅读Ruby文件并搜索方法代码,这并不容易实现。在Ruby 1.8中,您可以使用ParseTree和ruby2ruby。在1.9中,我不知道任何解决方案。