Предотвращение переопределения методов - PullRequest
0 голосов
/ 31 января 2012

Итак, мне нужно создать метод внутри класса, защищенный от переопределения.Я не совсем уверен, как еще это объяснить, поэтому вот код:

module Foo
    def bar
        p "lol"
    end
end

Итак, это оригинальный метод Foo#bar, и мне нужно, чтобы он был как константа.Итак, я нашел решение.Это должно было сохранить метод в константе и определить, когда кто-то попытался изменить его, он просто перезагрузил бы его из этой константы (это был объект Proc):

module Foo
        Original_bar = Proc.new { p "lol" }

        def bar
            Original_bar.call
        end

        def self.method_added(method_name)
            if method_name == :bar
                def Foo::bar
                    Original_bar.call
                end
            end
        end
end

Но это не полностью safe , поскольку однажды мог использовать тот же «трюк», который я использовал, чтобы обойти method_added, и я не очень люблю это, так как он не очень похож на рубин.


Тесты

Нормальный тест:

module Foo
    def bar
        p "lmao"
    end
end

Foo::bar # => "lol"

И еще один тест с использованием трюка :

def Foo::bar
    p "rofl"
end

Foo::bar # => "rofl"

tl; др

Как сделать метод в Ruby "неопределяемым" (если это даже слово) ?

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Если вы заморозите модуль, который должен предотвратить добавление метода к нему.

Обратите внимание, что расширение ac может размораживать переменные (см., Например, evil.rb .

0 голосов
/ 01 февраля 2012

Вы можете заставить свой код предупреждать вас, что метод был перезаписан, включив предупреждения:

$VERBOSE = true

module Foo
  def self.bar
    p "lmao"
  end
end

def Foo::bar
    p "rofl"
end

(irb):9: warning: method redefined; discarding old bar

Возможно, но не практично , выдавать исключение при выдаче предупреждений.

Однако это не предупредит вас, если вы сначала откажетесь от Foo.bar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...