当取消定义方法时,ruby undefine别名

时间:2014-11-26 21:42:52

标签: ruby

我在Ruby中注意到,当你取消定义一个方法时,它不会取消定义别名:

class Foo
end

Foo.instance_eval do
  def bar
    puts 'bar'
  end
end

Foo.bar # => bar

Foo.instance_eval {alias :baar :bar }

Foo.instance_eval { undef :bar }

Foo.bar # => NoMethodError: undefined method `bar' for Foo:Class

Foo.baar # => bar

通过undef删除该方法时,取消定义与方法关联的所有别名的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以通过选择与其相等的所有方法(请参阅here)列出别名为特定方法的所有方法,以便您可以定义如下方法:

class Class
  def undef_with_aliases(method_name)
    methods.select { |m| method(m) == method(method_name) }.each { |m| instance_eval "undef #{m}" }
  end
end

Foo.instance_eval { undef_with_aliases :bar }    

Foo.bar # => NoMethodError: undefined method `bar' for Foo:Class

Foo.baar # => NoMethodError: undefined method `baar' for Foo:Class