Удаление/неопределение метода класса

Можно динамично определить метод класса для класса как так:

class Foo
end

bar = %q{def bar() "bar!" end}
Foo.instance_eval(bar)

Но как дела противоположное: удалить/не определить метод класса? Я подозреваю Модуль remove_method и undef_method методы смогли использоваться с этой целью, но все примеры, я присматривал за поиском с помощью Google в течение многих часов, были для удаления/неопределения методов экземпляра, не методов класса. Или возможно существует синтаксис, которому можно передать instance_eval сделать это также.

Заранее спасибо.

50
задан Andrew Grimm 27 June 2011 в 12:25
поделиться

1 ответ

#!/usr/bin/ruby1.8

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, Ruby ставит IIGECLASS FOO. Ruby не может положить его в FO, потому что тогда это будет метод экземпляра. Ruby создает eigenclass foo (aka "Singleton Class"), устанавливает суперкласс Eigenclass в суперкласс Foo, а затем устанавливает SuperClass Foo в Eigenclass:

Foo -------------> Foo(eigenclass) -------------> Object
        super      def bar             super

, поэтому мы должны открыть EIGECCLASS, используя Foo для удаления полоса метода.

64
ответ дан 7 November 2019 в 10:54
поделиться