gpt4 book ai didi

ruby - 如何使用 method_missing 动态声明方法?

转载 作者:数据小太阳 更新时间:2023-10-29 07:10:51 24 4
gpt4 key购买 nike

我有一个 ruby​​ 程序,我想接受用户创建的方法,并使用该名称创建一个新方法。我试过这个:

def method_missing(meth,*args,&block)
name = meth.to_s
class << self
define_method(name) do
puts "hello " + name
end
end
end

我收到以下错误:

`define_method': interning empty string (ArgumentError) in 'method_missing'

有什么想法吗?谢谢。

编辑:

我以不同的方式让它工作,但我仍然很好奇如何以这种方式做到这一点。这是我的代码:

def method_missing(meth,*args,&block)
Adder.class_eval do
define_method(meth) do
puts "hello " + meth
end
end
send("#{meth}")
end

最佳答案

变量name在类定义 ( class << self) 范围内不可用。它不会抛出 NameError 因为你已经覆盖了 method_missing .

要完成您想要做的事情,您需要将范围保持在 name 范围内.为此,您必须只使用基于 block 的方法(例如 class_eval )而不是直接打开类,所以像这样:

def method_missing(meth,*args,&block)
name = meth.to_s
eigenclass = class << self; self; end
eigenclass.class_eval do
define_method(name) do
puts "hello " + name
end
end
end

但实际上,meth 中的符号已经足够了——你根本不需要名字。 (尽管无论如何您仍然需要上述技术。)除此之外,您还想立即执行该方法。最简单的方法就是重新发送消息:

def method_missing(meth,*args,&block)
eigenclass = class << self; self; end
eigenclass.class_eval do
define_method(meth) do
puts "hello #{meth}"
end
end
send(meth, *args, &block)
end

关于ruby - 如何使用 method_missing 动态声明方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8075270/

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