Итак, мне нужно создать метод внутри класса, защищенный от переопределения.Я не совсем уверен, как еще это объяснить, поэтому вот код:
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 "неопределяемым" (если это даже слово) ?