ruby - переопределить метод и затем вернуться - PullRequest
7 голосов
/ 20 апреля 2011

Я пытаюсь найти способ, которым я могу переопределить метод, сделать что-то, а затем вернуться, не оставляя при этом никаких артефактов.

Я реализовал это, используя mocha, но, очевидно, это не будет летать впроизводственное приложение.Обратите внимание, что новый метод имеет параметры, а старый - нет.

Пример выглядит следующим образом

require 'rubygems'
require 'mocha'

class Example

  def to_something
    self.stubs(:attribs => other(1))
    r = attribs_caller
    self.unstub(:attribs)
    r
  end

  def other(int)
    {"other" => int }
  end

  def attribs_caller
    attribs
  end

  def attribs
    {"this" => 1 }
  end

end

a1 = Example.new

puts a1.attribs_caller  #=> this1
puts a1.to_something    #=> other1
puts a1.attribs_caller  #=> this1

Ответы [ 2 ]

8 голосов
/ 20 апреля 2011
class String
  alias orig_reverse reverse
  def reverse(n)
    'fooled you. '*n
  end
end

puts "ab".reverse(2)
#=> fooled you fooled you

# clean up:
class String
  alias reverse orig_reverse
  remove_method(:orig_reverse)
end

puts "ab".reverse #=> ba
3 голосов
/ 21 апреля 2011

Еще один способ сделать это, не создавая дополнительный метод, это:

class Foo
  def bar
    :old_method
  end
end

Foo.new.foo # => :old_method

$old_method = Foo.new.method(:bar)

class Foo
  def bar
    :new_method
  end
end

Foo.new.foo # => :new_method

class Foo
  define_method($old_method.name, &$old_method)
end

Foo.new.foo # => :old_method

Я думаю, что это лучше, чем использование метода псевдонимов. В Ruby методы тоже являются объектами. Я просто беру ссылку на объект, прежде чем разрушить ассоциацию объекта (метода) с классом. После того, как я добавлю тот же метод. Это также работает, если вы используете ключевое слово undef для удаления метода из класса. Плохо то, что вам нужен объект класса, чтобы получить ссылку на метод.

...