我需要禁用一个类方法一段时间,然后再次启用它。我怎么能这样做?我知道我可以删除一个方法:
class Foo
def Foo.bar
puts "bar"
end
end
Foo.bar # => bar
class <<Foo
remove_method :bar
end
Foo.bar # => undefined method `bar' for Foo:Class (NoMethodError)
现在我需要再次Foo.bar
。我怎么能这样做?我试图将方法保存在proc
m = Proc.new { Foo.bar }
然后再次定义:
class Foo
define_method(:bar, &m)
end
但我得到
NameError: undefined local variable or method 'm' for...
所以我把范围弄平了
P = Class.new(Foo) do
define_method(:bar, &m)
end
但如果我运行它,我会得到未定义的方法
P.bar
Foo.bar
是否可以保存方法,取消定义,然后再定义它?
答案 0 :(得分:2)
您应该将方法保留为方法,而不是将方法体保留在proc中。不断地以不同的名称定义它,并在它的别名之间切换Foo.bar
。
class Foo
def Foo.temporal_bar
puts "bar"
end
end
Foo.singleton_class.class_eval{alias bar temporal_bar}
Foo.bar # => bar
Foo.singleton_class.class_eval{remove_method bar}
Foo.bar # => Undefined local variable or method `bar' for #<Class:Foo>
Foo.singleton_class.class_eval{alias bar temporal_bar}
Foo.bar # => bar
答案 1 :(得分:0)
您可以试用instance_eval
:
(class << Foo; self; end).instance_eval do
define_method(:bar, &m)
end