取消定义类方法,然后再返回以定义它

时间:2014-02-26 14:30:02

标签: ruby

我需要禁用一个类方法一段时间,然后再次启用它。我怎么能这样做?我知道我可以删除一个方法:

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

是否可以保存方法,取消定义,然后再定义它?

2 个答案:

答案 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