按如下方式定义一个类。我想动态调用one_method。默认情况下,wow.one_method调用第一个one_method。如果我想改变方法的行为,只需调用redefine即可。
我可以将该方法实现为函数类型属性,但这不是我想要的。
如果我直接使用下面的代码,它将报告错误。你能稍微修改一下吗?
class Wow
def one_method
puts "hello Ruby"
end
def redefine(what="none")
define_method :one_method do
puts what
end
end
end
wow = Wow.new
wow.redefine("Whatever I want.")发布于 2018-09-07 17:44:25
您可以通过class_eval或instance_eval实现这一点
class Wow
def one_method
puts "hello Ruby"
end
def redefine(what="none")
self.class.class_eval do
define_method :one_method do
puts what
end
end
end
end
wow = Wow.new
wow.one_method #=> hello Ruby
wow.redefine("Whatever I want.")
wow.one_method #=> Whatever I want.原因是define_method在接收器上定义了实例方法,并且是一个类的实例方法,所以你必须在你想要重新定义方法的对象的eigen类上调用它。
发布于 2018-09-07 18:26:09
我建议以一种更规范的方式实现您的目标,只需在实例本身上重新定义方法:
class Wow
def one
:one
end
end
w = Wow.new
w.one
#=> :one
def w.one
:two
end
w.one
#=> :two缺点是:
替代方案:
我不知道您的真正问题,但对于您的特定问题,最好是将您的one_method方法参数化,以便接收puts的参数。此外,您可以传递一个块,因此您将获得对行为的更细粒度的控制。
https://stackoverflow.com/questions/52219538
复制相似问题