Как добавить операторы в существующее определение метода в Ruby - PullRequest
5 голосов
/ 06 августа 2011

Я заметил для определения класса, если я открою class MyClass и добавлю что-то промежуточное без перезаписи, я все равно получу оригинальный метод, который был определен ранее.Добавленные новые операторы дополняют существующий.

Но что касается определения метода, я все еще хочу такое же поведение, как и определение класса, но кажется, что когда я открываю def my_method, операторы выхода внутриdef и end перезаписаны, мне нужно переписать это снова.

Так есть ли способ заставить определение метода вести себя так же, как определение, что-то вроде super, но это не обязательносуб-класс?

Ответы [ 2 ]

9 голосов
/ 06 августа 2011

Полагаю, вы ищете alias_method :

class A
  alias_method :old_func, :func

  def func
    old_func # similar to calling 'super'
    # do other stuff
  end
end
0 голосов
/ 07 марта 2016

@ emboss, что если вы не хотите выполнять код после old_func, если он содержит условный возврат? Как вы можете видеть, это что-то вроде before_action в Rails. Например:

class MyClass
  alias_method :old_func, :func

  def aloha
    puts 'Something'
    return smth if other_thing
    puts 'End of method'
  end

  def func
    aloha # Don't call :old_func if aloha return condition is true
    old_func
  end
end

MyClass.new.func # Should return <smth> from aloha method.

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

...