Можно динамично определить метод класса для класса как так:
class Foo
end
bar = %q{def bar() "bar!" end}
Foo.instance_eval(bar)
Но как дела противоположное: удалить/не определить метод класса? Я подозреваю Модуль remove_method
и undef_method
методы смогли использоваться с этой целью, но все примеры, я присматривал за поиском с помощью Google в течение многих часов, были для удаления/неопределения методов экземпляра, не методов класса. Или возможно существует синтаксис, которому можно передать instance_eval
сделать это также.
Заранее спасибо.
#!/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
для удаления полоса метода.