В библиотеке вне моего контроля есть метод, который использует блок, чтобы делать замечательные вещи. Теперь я хотел бы создать некоторые перегрузки, чтобы сделать мою жизнь еще проще, но не могу понять, как заставить ее работать так, как я хочу.
Вот что у меня есть:
class ClassNotDefinedByMe
def enhanced_awesome_method(&block)
if block.arity < 2
awesome_method(&block)
else
# Doing my own extensions here.
# This part is not the issue.
end
end
end
ClassNotDefinedByMe
находится в библиотеке, как и awesome_method
. awesome_method
принимает блок и выполняет значимые действия с параметром 0 или 1 для этого блока. Любое другое количество аргументов приводит к возникновению исключений. Я написал выше, чтобы добавить возможность использовать 2 или 3 параметра в блоке, и все работает нормально, за исключением того, что теперь я должен вызывать enhanced_awesome_method
вместо awesome_method
.
Примеры для уточнения (x является экземпляром ClassNotDefinedByMe
):
# These two comes from the library:
x.awesome_method{ puts "works" }
x.awesome_method{ |i| puts "also works, the argument is #{i}" }
# Now I can do this:
x.enhanced_awesome_method{ |i,j| puts "oh, two arguments! cool." }
x.enhanced_awesome_method{ |i,j,k| puts "three arguments, how bold!" }
# But I want to be able to do this:
x.awesome_method{ puts "still works" }
x.awesome_method{ |i| puts "still works" }
x.awesome_method{ |i,j| puts "still works" }
x.awesome_method{ |i,j,k| puts "still works" }
Можно утверждать, что это хорошо, что мне нужно использовать новое имя для моего расширенного метода, чтобы стало очевидно, что это другой метод, но я действительно хотел бы заменить awesome_method
своим собственным. Он не нарушит существующий код, поскольку поведение для параметров 0 и 1 идентично, и до сих пор это были единственные допустимые варианты.
Итак, проблема, с которой я сталкиваюсь, заключается в том, что если я назову свой метод awesome_method
и передам ему блок с параметром 0 или 1, он будет вызываться сам навсегда. Если бы это был случай наследования, я бы решил его, позвонив по номеру super.awesome_method
, но что я могу сделать в этом случае, когда я просто изменил сам класс?