gpt4 book ai didi

Ruby:打印任意方法的代码(并在上下文中执行)

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:36 25 4
gpt4 key购买 nike

我想做如下的事情:

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 代码?最好,它们应该适用于任何任意方法,而无需先验地知道它们可能碰巧在哪里定义或来源。

  • 是的,我知道方法和 block 并不完全相同。但这更接近 yield 和 call 通常需要的;我不知道有更好的解决方案。

最佳答案

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!"

关于Ruby:打印任意方法的代码(并在上下文中执行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/985102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com