Улучшение метода Ruby - PullRequest
       4

Улучшение метода Ruby

0 голосов
/ 13 декабря 2010

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

Вот что у меня есть:

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, но что я могу сделать в этом случае, когда я просто изменил сам класс?

Ответы [ 2 ]

3 голосов
/ 13 декабря 2010

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

например:

class ClassNotDefinedByMe
    alias :old_awesome_method :awesome_method

    def awesome_method(&block)
        if block.arity < 2
            old_awesome_method(&block)
        else
            # Awesome stuff here
        end
    end
end
0 голосов
/ 13 декабря 2010

То, что вы пытаетесь сделать, называется псевдонимом метода , но оно заменяет оригинальный метод.

...