ruby - 覆盖方法然后还原

标签 ruby extension-methods

我正在尝试找到一种方法,我可以覆盖一个方法,做一些事情,然后在不留下任何工件的情况下恢复。

我已经使用 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

最佳答案

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

关于ruby - 覆盖方法然后还原,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5734527/

相关文章:

Ruby:为了方便定义类时是 "initialize"?

ruby - Ruby 数组中的奇数(或偶数)条目

.net - IDisposable : Method 'X' has multiple definitions with identical signatures

c# - EntityObject 到 DbContext

ruby-on-rails - Rails - 创建一个打印所有对象的特定属性的辅助方法(改为渲染数组)

ruby-on-rails - 如何修复 Mechanize::ChunkedTerminationError?

c# - 是否可以创建构造函数扩展方法?如何?

c# - 如何修改一个简单的字符串扩展来支持 SQL

c# - 自定义扩展方法与框架扩展方法冲突。为什么?

html - 在 slim 中使用粗体或斜体等标签?